Integrate Soundcheck with the Backstage Notifications plugin for check status and certification change alerts, replacing legacy Slack and email notifications.
Soundcheck integrates with the Notifications plugin by providing a number of built in notifications.
The legacy campaign notification systems — direct Slack integration and direct
email (SMTP) integration — are deprecated and will be removed in a future
release. Migrate to the Backstage Notifications plugin as described below.
Direct Slack notifications — The soundcheck.slack configuration block and the supportChannel field on campaigns are deprecated. These power direct Slack message delivery via the SlackNotificationService.
Direct email notifications — The soundcheck.email configuration block is deprecated. This powers direct SMTP email delivery via the EmailNotificationService.
The Backstage Notifications plugin provides a unified notification system that supports multiple delivery channels (in-app, Slack, email, etc.) through Backstage notification modules. All campaign notifications are supported in the Backstage Notifications plugin integration.
By default, when soundcheck.notifications.enabled is true, all checks, tracks, and campaigns trigger notifications. You can configure an optional allowlist to limit notifications to specific items.
When allowlist is not configured, all items trigger notifications (backwards-compatible).
The checks, tracks, and campaigns lists are independent. If only checks is specified, only check notifications are filtered; track and campaign notifications continue for all items.
When an allowlist is specified for a type (e.g., checks), only items whose IDs appear in that list generate notifications. For example, with the configuration above, a failing check with ID has-readme triggers a notification, but a failing check with ID has-tests does not.
An empty array (e.g., checks: []) blocks all notifications of that type.
For campaigns and milestones, the allowlist gates all notification channels (Backstage notifications, Slack, and email). For checks and tracks, it only gates Backstage notifications since these don’t send Slack/email notifications.
This documents notifications that Soundcheck will send. To build more robust or complex notifications involving Soundcheck, we suggest looking at events.
Previously Passing Check is now Failing - owner of entities that are failing this check. If multiple entities a user owns are failing a check, only 1 notification is sent. This only triggers if the previous check state was passed.
Previously Certified Track is now Failing - owner of entities that are failing certification. If multiple entities a user owns are failing certification, only 1 notification is sent. This only triggers if the previous certification state was passed.
Previously Passing Campaign is now Failing - owner of entities that are failing this campaign. If multiple entities a user owns are failing this campaign, only 1 notification is sent. This only triggers if the previous campaign state was passed.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Spotify for Backstage","colors":{"primary":"#34baa2","light":"#9af0e1","dark":"#91eeda"},"logo":{"light":"https://mintcdn.com/spotify-89f50c35/24doFeqc-xIrJKxF/static/logo/light.svg?fit=max\u0026auto=format\u0026n=24doFeqc-xIrJKxF\u0026q=85\u0026s=e7c3376851f302fc6d1308df15deb771","dark":"https://mintcdn.com/spotify-89f50c35/24doFeqc-xIrJKxF/static/logo/dark.svg?fit=max\u0026auto=format\u0026n=24doFeqc-xIrJKxF\u0026q=85\u0026s=a4e4bd6c0b855fc5959169face3701e1","href":"/"},"favicon":"https://mintcdn.com/spotify-89f50c35/6C5KyJhdlFRgXnE0/static/favicon.ico?fit=max\u0026auto=format\u0026n=6C5KyJhdlFRgXnE0\u0026q=85\u0026s=78c7096e52c0a4493c1d4b76355d22d9","api":{"playground":{"display":"simple"}},"appearance":{"default":"dark"},"navbar":{"links":[{"href":"https://backstage.spotify.com/contact-us/try-portal/","label":"Try Spotify Portal"}],"primary":{"type":"button","label":"Log in","href":"https://backstage.spotify.com/login/"}},"footer":{"socials":{"linkedin":"https://www.linkedin.com/showcase/spotify-r\u0026d","x":"https://twitter.com/spotifyeng","youtube":"https://www.youtube.com/@SpotifyRnD","instagram":"https://www.instagram.com/lifeatspotify","facebook":"https://www.facebook.com/spotify"},"links":[{"header":"Learn More","items":[{"label":"Go to backstage.spotify.com","href":"https://backstage.spotify.com"},{"label":"Explore the demo","href":"https://demo.backstage.io/catalog"},{"label":"Partner interest form","href":"https://backstage.spotify.com/interested-in-partnering"}]},{"header":"News \u0026 Updates","items":[{"label":"Read our blog","href":"https://backstage.spotify.com/blog"},{"label":"Subscribe to newsletter","href":"https://spoti.fi/backstagenewsletter"},{"label":"Portal system status","href":"https://status.spotifyportal.com"}]},{"header":"Community","items":[{"label":"Join the community","href":"https://github.com/backstage/community"},{"label":"Get Backstage Certified","href":"https://www.cncf.io/training/certification/cba"}]},{"header":"Legal","items":[{"label":"Security","href":"https://backstage.spotify.com/security"},{"label":"Privacy Policy","href":"https://backstage.spotify.com/spotify-for-backstage-terms/privacy-policy"},{"label":"Cookies","href":"https://www.spotify.com/legal/cookies-policy"},{"label":"Terms of Service","href":"https://backstage.spotify.com/terms-of-service"},{"label":"Trademark Usage","href":"https://www.linuxfoundation.org/legal/trademark-usage"}]}]},"seo":{"metatags":{"canonical":"https://backstage.spotify.com/docs"}},"fonts":{"heading":{"family":"Circular Sp","source":"https://mintlify-assets.b-cdn.net/fonts/CircularSpTitle-Bold.woff2","format":"woff2"},"body":{"family":"Circular Sp","source":"https://mintlify-assets.b-cdn.net/fonts/CircularSp-Book.woff2","format":"woff2"}},"styling":{"codeblocks":{"theme":{"light":"github-light","dark":"dracula"}},"latex":false},"integrations":{"gtm":{"tagId":"GTM-58S6R55"},"telemetry":{"enabled":false}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"navigation":{"global":{"anchors":[{"anchor":"Contact us","icon":"headset","href":"https://backstage.spotify.com/contact-us/talk-to-us/"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"spotify-89f50c35","hasAudioNarration":false,"actualSubdomain":"spotify-89f50c35","customDomains":["backstage.spotify.com"],"gitSource":{"type":"github","owner":"backstage-external","repo":"spotify-for-backstage-docs","deployBranch":"main","contentDirectory":"public","isPrivate":true,"mountPath":"","label":""},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"REMOVE_BRANDING":{"status":"ENABLED"},"CONTEXTUAL_FEEDBACK":{"status":"ENABLED"},"CODE_SNIPPET_FEEDBACK":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af5c8c1bb452cd0b1db62ad","clientVersion":"0.0.4117","searchFilterCounts":[{"language":"default","tag":"Portal","count":140},{"language":"default","tag":"Plugins","count":111},{"language":"default","tag":"Soundcheck","count":88},{"language":"default","tag":"Portal Features \u0026 Plugins","count":88},{"language":"default","tag":"API Reference","count":45},{"language":"default","tag":"Integrations","count":35},{"language":"default","tag":"Guides","count":34},{"language":"default","tag":"Core Concepts","count":31},{"language":"default","tag":"Checks","count":19},{"language":"default","tag":"Fact Collectors","count":16}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"email":"backstage-support@spotify.com","showHelpButton":true}},"basePath":"/docs","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"styles.css","content":"body{--font-jetbrains-mono:\n 'JetBrains Mono', SF Mono, SFMono-Regular, Menlo, Monaco, Cascadia Mono,\n Segoe UI Mono, Roboto Mono, Oxygen Mono, Ubuntu Monospace, Source Code Pro,\n Fira Mono, Droid Sans Mono, Consolas, Courier New, monospace}#topbar-cta-button svg path{stroke:#000000}#topbar-cta-button span{color:#000000}#content:has(.video-overlay){isolation:auto}.landing-page-card{transition:all 0.3s cubic-bezier(0.4, 0, 0.2, 1);backdrop-filter:blur(12px);border-width:2px;background-color:rgb(255 255 255)}.landing-page-card:is(.dark *){background-color:rgb(255 255 255 / 0.1)}.landing-page-card:hover{transform:translateY(-0.25rem)}.landing-page-card [data-component-part=\"card-icon\"],.landing-page-card [data-component-part=\"card-icon\"]>img{width:48px;height:48px}.landing-page-card h2{font-size:1.5rem;margin-bottom:1rem;font-weight:600}"}],"page":{"pagePath":"plugins/soundcheck/core-concepts/notifications","slug":"/plugins/soundcheck/core-concepts/notifications","pageMetadata":{"title":"Notifications","sidebar_position":12,"description":"Integrate Soundcheck with the Backstage Notifications plugin for check status and certification change alerts, replacing legacy Slack and email notifications.","href":"/plugins/soundcheck/core-concepts/notifications"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Integrate Soundcheck with the Backstage Notifications plugin for check status and certification change alerts, replacing legacy Slack and email notifications.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Soundcheck integrates with the `,_jsx(_components.a,{href:`https://backstage.io/docs/notifications/`,children:`Notifications plugin`}),` by providing a number of built in notifications.`]}),`\n`,_jsx(Heading,{level:`2`,id:`setup`,children:`Setup`}),`\n`,_jsxs(_components.p,{children:[`Install the notifications plugin for Backstage per the `,_jsx(_components.a,{href:`https://backstage.io/docs/notifications/#installation`,children:`instructions here`}),`.`]}),`\n`,_jsx(_components.p,{children:`In soundcheck enable notifications globally with the following setting:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light dracula`,style:{backgroundColor:`#fff`,\"--shiki-dark-bg\":`#282A36`,color:`#24292e`,\"--shiki-dark\":`#F8F8F2`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#22863A`,\"--shiki-dark\":`#8BE9FD`},children:`soundcheck`}),_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#FF79C6`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#22863A`,\"--shiki-dark\":`#8BE9FD`},children:` notifications`}),_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#FF79C6`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#22863A`,\"--shiki-dark\":`#8BE9FD`},children:` enabled`}),_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#005CC5`,\"--shiki-dark\":`#BD93F9`},children:` true`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`migrating-from-legacy-soundcheck-notifications`,children:`Migrating from Legacy Soundcheck Notifications`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`The legacy campaign notification systems — direct Slack integration and direct\nemail (SMTP) integration — are `,_jsx(_components.strong,{children:`deprecated`}),` and will be removed in a future\nrelease. Migrate to the Backstage Notifications plugin as described below.`]})}),`\n`,_jsx(Heading,{level:`4`,id:`what-is-deprecated`,children:`What is deprecated`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Direct Slack notifications`}),` — The `,_jsx(_components.code,{children:`soundcheck.slack`}),` configuration block and the `,_jsx(_components.code,{children:`supportChannel`}),` field on campaigns are deprecated. These power direct Slack message delivery via the `,_jsx(_components.code,{children:`SlackNotificationService`}),`.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`6`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light dracula`,style:{backgroundColor:`#fff`,\"--shiki-dark-bg\":`#282A36`,color:`#24292e`,\"--shiki-dark\":`#F8F8F2`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`6`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6A737D`,\"--shiki-dark\":`#6272A4`},children:`# Deprecated`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#22863A`,\"--shiki-dark\":`#8BE9FD`},children:`soundcheck`}),_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#FF79C6`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#22863A`,\"--shiki-dark\":`#8BE9FD`},children:` slack`}),_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#FF79C6`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#22863A`,\"--shiki-dark\":`#8BE9FD`},children:` token`}),_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#F1FA8C`},children:\" ${SLACK_OAUTH_TOKEN}\"})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#22863A`,\"--shiki-dark\":`#8BE9FD`},children:` appToken`}),_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#F1FA8C`},children:\" ${SLACK_APP_TOKEN}\"})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#22863A`,\"--shiki-dark\":`#8BE9FD`},children:` signingSecret`}),_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#F1FA8C`},children:\" ${SLACK_SIGNING_SECRET}\"})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Direct email notifications`}),` — The `,_jsx(_components.code,{children:`soundcheck.email`}),` configuration block is deprecated. This powers direct SMTP email delivery via the `,_jsx(_components.code,{children:`EmailNotificationService`}),`.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`9`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light dracula`,style:{backgroundColor:`#fff`,\"--shiki-dark-bg\":`#282A36`,color:`#24292e`,\"--shiki-dark\":`#F8F8F2`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`9`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6A737D`,\"--shiki-dark\":`#6272A4`},children:`# Deprecated`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#22863A`,\"--shiki-dark\":`#8BE9FD`},children:`soundcheck`}),_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#FF79C6`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#22863A`,\"--shiki-dark\":`#8BE9FD`},children:` email`}),_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#FF79C6`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#22863A`,\"--shiki-dark\":`#8BE9FD`},children:` host`}),_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#F1FA8C`},children:` smtp.example.com`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#22863A`,\"--shiki-dark\":`#8BE9FD`},children:` port`}),_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#005CC5`,\"--shiki-dark\":`#BD93F9`},children:` 587`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#22863A`,\"--shiki-dark\":`#8BE9FD`},children:` from`}),_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#F1FA8C`},children:` soundcheck@example.com`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#22863A`,\"--shiki-dark\":`#8BE9FD`},children:` auth`}),_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#FF79C6`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#22863A`,\"--shiki-dark\":`#8BE9FD`},children:` user`}),_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#F1FA8C`},children:\" ${SMTP_USER}\"})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#22863A`,\"--shiki-dark\":`#8BE9FD`},children:` pass`}),_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#F1FA8C`},children:\" ${SMTP_PASS}\"})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`4`,id:`migration-steps`,children:`Migration steps`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Enable the Backstage Notifications plugin: set `,_jsx(_components.code,{children:`soundcheck.notifications.enabled: true`})]}),`\n`,_jsxs(_components.li,{children:[`Remove the `,_jsx(_components.code,{children:`soundcheck.slack`}),` and `,_jsx(_components.code,{children:`soundcheck.email`}),` configuration blocks`]}),`\n`,_jsxs(_components.li,{children:[`The `,_jsx(_components.code,{children:`supportChannel`}),` field on campaigns will be ignored once the legacy systems are removed`]}),`\n`,_jsxs(_components.li,{children:[`Install email or slack processors as indicated in the `,_jsx(_components.a,{href:`https://backstage.io/docs/notifications/processors#built-in-processors`,children:`Backstage documentation`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`See the `,_jsx(_components.a,{href:`https://backstage.io/docs/notifications/`,children:`Backstage Notifications documentation`}),` for more information.`]}),`\n`,_jsx(Heading,{level:`4`,id:`replacement`,children:`Replacement`}),`\n`,_jsxs(_components.p,{children:[`The Backstage Notifications plugin provides a unified notification system that supports multiple delivery channels (in-app, Slack, email, etc.) through Backstage notification modules. All `,_jsx(_components.a,{href:`/plugins/soundcheck/core-concepts/campaigns#campaign-notifications`,children:`campaign notifications`}),` are supported in the Backstage Notifications plugin integration.`]}),`\n`,_jsx(Heading,{level:`4`,id:`differences-between-legacy-and-new-system`,children:`Differences between legacy and new system`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`The new system integrates directly with the open source notifications plugin and benefits from the features there.`}),`\n`,_jsx(_components.li,{children:`The new system has additional notification types, and enhanced campaign notifications.`}),`\n`,_jsx(_components.li,{children:`Any new features around notifications will only work with the new notification system.`}),`\n`,_jsx(_components.li,{children:`Email and Slack are no longer configured within Soundcheck and as part of the campaign fields, but within the notification processors.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`notification-allowlist`,children:`Notification Allowlist`}),`\n`,_jsxs(_components.p,{children:[`By default, when `,_jsx(_components.code,{children:`soundcheck.notifications.enabled`}),` is `,_jsx(_components.code,{children:`true`}),`, all checks, tracks, and campaigns trigger notifications. You can configure an optional allowlist to limit notifications to specific items.`]}),`\n`,_jsx(Heading,{level:`3`,id:`configuration`,children:`Configuration`}),`\n`,_jsxs(_components.p,{children:[`Add an `,_jsx(_components.code,{children:`allowlist`}),` under `,_jsx(_components.code,{children:`soundcheck.notifications`}),` in your `,_jsx(_components.code,{children:`app-config.yaml`}),`:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`11`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light dracula`,style:{backgroundColor:`#fff`,\"--shiki-dark-bg\":`#282A36`,color:`#24292e`,\"--shiki-dark\":`#F8F8F2`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`11`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#22863A`,\"--shiki-dark\":`#8BE9FD`},children:`soundcheck`}),_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#FF79C6`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#22863A`,\"--shiki-dark\":`#8BE9FD`},children:` notifications`}),_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#FF79C6`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#22863A`,\"--shiki-dark\":`#8BE9FD`},children:` enabled`}),_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#FF79C6`},children:`:`}),_jsx(_components.span,{style:{color:`#005CC5`,\"--shiki-dark\":`#BD93F9`},children:` true`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#22863A`,\"--shiki-dark\":`#8BE9FD`},children:` allowlist`}),_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#FF79C6`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#22863A`,\"--shiki-dark\":`#8BE9FD`},children:` checks`}),_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#FF79C6`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#F1FA8C`},children:` has-readme`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#F1FA8C`},children:` has-owner`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#22863A`,\"--shiki-dark\":`#8BE9FD`},children:` tracks`}),_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#FF79C6`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#F1FA8C`},children:` micro-certified`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#22863A`,\"--shiki-dark\":`#8BE9FD`},children:` campaigns`}),_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#FF79C6`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#24292E`,\"--shiki-dark\":`#FF79C6`},children:` -`}),_jsx(_components.span,{style:{color:`#032F62`,\"--shiki-dark\":`#F1FA8C`},children:` q2-reliability-push`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`behavior`,children:`Behavior`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`When `,_jsx(_components.code,{children:`allowlist`}),` is `,_jsx(_components.strong,{children:`not configured`}),`, all items trigger notifications (backwards-compatible).`]}),`\n`,_jsxs(_components.li,{children:[`The `,_jsx(_components.code,{children:`checks`}),`, `,_jsx(_components.code,{children:`tracks`}),`, and `,_jsx(_components.code,{children:`campaigns`}),` lists are `,_jsx(_components.strong,{children:`independent`}),`. If only `,_jsx(_components.code,{children:`checks`}),` is specified, only check notifications are filtered; track and campaign notifications continue for all items.`]}),`\n`,_jsxs(_components.li,{children:[`When an allowlist is specified for a type (e.g., `,_jsx(_components.code,{children:`checks`}),`), only items whose IDs appear in that list generate notifications. For example, with the configuration above, a failing check with ID `,_jsx(_components.code,{children:`has-readme`}),` triggers a notification, but a failing check with ID `,_jsx(_components.code,{children:`has-tests`}),` does not.`]}),`\n`,_jsxs(_components.li,{children:[`An `,_jsx(_components.strong,{children:`empty array`}),` (e.g., `,_jsx(_components.code,{children:`checks: []`}),`) blocks all notifications of that type.`]}),`\n`,_jsxs(_components.li,{children:[`For campaigns and milestones, the allowlist gates `,_jsx(_components.strong,{children:`all notification channels`}),` (Backstage notifications, Slack, and email). For checks and tracks, it only gates Backstage notifications since these don’t send Slack/email notifications.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`notification-types`,children:`Notification Types`}),`\n`,_jsxs(_components.p,{children:[`This documents notifications that Soundcheck will send. To build more robust or complex notifications involving Soundcheck, we suggest looking at `,_jsx(_components.a,{href:`/plugins/soundcheck/core-concepts/events`,children:`events`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`campaigns`,children:`Campaigns`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Campaign Create`}),` - owner of Campaign`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Campaign Updated`}),` - owner of Campaign`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Campaign Archived`}),` - owner of Campaign`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Campaign Deleted`}),` - owner of Campaign`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Campaign Milestone Reached`}),` - owner of Campaign`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`checks`,children:`Checks`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Previously Passing Check is now Failing`}),` - owner of entities that are failing this check. If multiple entities a user owns are failing a check, only 1 notification is sent. This only triggers if the previous check state was passed.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`tracks`,children:`Tracks`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Previously Certified Track is now Failing`}),` - owner of entities that are failing certification. If multiple entities a user owns are failing certification, only 1 notification is sent. This only triggers if the previous certification state was passed.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Previously Passing Campaign is now Failing`}),` - owner of entities that are failing this campaign. If multiple entities a user owns are failing this campaign, only 1 notification is sent. This only triggers if the previous campaign state was passed.`]}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":{"theme":{"light":"github-light","dark":"dracula"}},"config":{},"pageMetadata":{"title":"Notifications","sidebar_position":12,"description":"Integrate Soundcheck with the Backstage Notifications plugin for check status and certification change alerts, replacing legacy Slack and email notifications.","href":"/plugins/soundcheck/core-concepts/notifications"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Setup","slug":"setup","depth":2,"children":[{"title":"Migrating from Legacy Soundcheck Notifications","slug":"migrating-from-legacy-soundcheck-notifications","depth":3,"children":[]},{"title":"What is deprecated","slug":"what-is-deprecated","depth":4,"children":[]},{"title":"Migration steps","slug":"migration-steps","depth":4,"children":[]},{"title":"Replacement","slug":"replacement","depth":4,"children":[]},{"title":"Differences between legacy and new system","slug":"differences-between-legacy-and-new-system","depth":4,"children":[]}]},{"title":"Notification Allowlist","slug":"notification-allowlist","depth":2,"children":[{"title":"Configuration","slug":"configuration","depth":3,"children":[]},{"title":"Behavior","slug":"behavior","depth":3,"children":[]}]},{"title":"Notification Types","slug":"notification-types","depth":2,"children":[{"title":"Campaigns","slug":"campaigns","depth":3,"children":[]},{"title":"Checks","slug":"checks","depth":3,"children":[]},{"title":"Tracks","slug":"tracks","depth":3,"children":[]}]}],"codeExamples":{}},"jsLinks":[],"subdomain":"spotify-89f50c35","siteName":"Spotify for Backstage","title":"Notifications - Spotify for Backstage","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-06-22T13:42:05.360Z","originalFileLocation":"plugins/soundcheck/core-concepts/notifications.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Integrate Soundcheck with the Backstage Notifications plugin for check status and certification change alerts, replacing legacy Slack and email notifications.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Spotify for Backstage\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/spotify-89f50c35/R_8z5ScClO7v3nRq/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/docs/mintlify-assets/_mintlify/favicons/spotify-89f50c35/R_8z5ScClO7v3nRq/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/spotify-89f50c35/R_8z5ScClO7v3nRq/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/spotify-89f50c35/R_8z5ScClO7v3nRq/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/spotify-89f50c35/R_8z5ScClO7v3nRq/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/spotify-89f50c35/R_8z5ScClO7v3nRq/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/spotify-89f50c35/R_8z5ScClO7v3nRq/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/spotify-89f50c35/R_8z5ScClO7v3nRq/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/spotify-89f50c35/R_8z5ScClO7v3nRq/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Notifications - Spotify for Backstage\">\u003cmeta data-mint-head property=\"og:description\" content=\"Integrate Soundcheck with the Backstage Notifications plugin for check status and certification change alerts, replacing legacy Slack and email notifications.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Spotify for Backstage\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/notifications\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://spotify-89f50c35.mintlify.site/docs/_mintlify/api/og/v2?division=Core+Concepts\u0026amp;title=Notifications\u0026amp;description=Integrate+Soundcheck+with+the+Backstage+Notifications+plugin+for+check+status+and+certification+change+alerts%2C+replacing+legacy+Slack+and+email+notifications.\u0026amp;theme=a6f41037062b0a3b3eab7f14\u0026amp;signature=58947cddec979a6ea5e154380d3c8e858484d2f44ba062c69c4e7e946af16c61\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Notifications - Spotify for Backstage\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Integrate Soundcheck with the Backstage Notifications plugin for check status and certification change alerts, replacing legacy Slack and email notifications.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://spotify-89f50c35.mintlify.site/docs/_mintlify/api/og/v2?division=Core+Concepts\u0026amp;title=Notifications\u0026amp;description=Integrate+Soundcheck+with+the+Backstage+Notifications+plugin+for+check+status+and+certification+change+alerts%2C+replacing+legacy+Slack+and+email+notifications.\u0026amp;theme=a6f41037062b0a3b3eab7f14\u0026amp;signature=58947cddec979a6ea5e154380d3c8e858484d2f44ba062c69c4e7e946af16c61\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/docs/mintlify-assets/_mintlify/favicons/spotify-89f50c35/R_8z5ScClO7v3nRq/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Spotify for Backstage\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#34baa2\">\u003clink data-mint-head rel=\"canonical\" href=\"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/notifications\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/docs/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/plugins/soundcheck/core-concepts/notifications.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://backstage.spotify.com/#organization\",\"name\":\"Spotify for Backstage\",\"url\":\"https://backstage.spotify.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/spotify-89f50c35/24doFeqc-xIrJKxF/static/logo/light.svg?fit=max\u0026auto=format\u0026n=24doFeqc-xIrJKxF\u0026q=85\u0026s=e7c3376851f302fc6d1308df15deb771\"}},{\"@type\":\"WebSite\",\"@id\":\"https://backstage.spotify.com/docs#website\",\"name\":\"Spotify for Backstage\",\"url\":\"https://backstage.spotify.com/docs\",\"publisher\":{\"@id\":\"https://backstage.spotify.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/notifications#webpage\",\"url\":\"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/notifications\",\"name\":\"Notifications\",\"description\":\"Integrate Soundcheck with the Backstage Notifications plugin for check status and certification change alerts, replacing legacy Slack and email notifications.\",\"dateModified\":\"2026-06-22T13:42:05.360Z\",\"isPartOf\":{\"@id\":\"https://backstage.spotify.com/docs#website\"},\"breadcrumb\":{\"@id\":\"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/notifications#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/notifications#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Soundcheck\",\"item\":\"https://backstage.spotify.com/docs/plugins/soundcheck\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Core Concepts\",\"item\":\"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Notifications\",\"item\":\"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/notifications\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/notifications#article\",\"headline\":\"Notifications\",\"name\":\"Notifications\",\"description\":\"Integrate Soundcheck with the Backstage Notifications plugin for check status and certification change alerts, replacing legacy Slack and email notifications.\",\"url\":\"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/notifications\",\"mainEntityOfPage\":{\"@id\":\"https://backstage.spotify.com/docs/plugins/soundcheck/core-concepts/notifications#webpage\"},\"dateModified\":\"2026-06-22T13:42:05.360Z\",\"publisher\":{\"@id\":\"https://backstage.spotify.com/#organization\"},\"isPartOf\":{\"@id\":\"https://backstage.spotify.com/docs#website\"}}]}\u003c/script>","agentPointerHref":"/docs/plugins/soundcheck/core-concepts/notifications.md","siteName":"Spotify for Backstage","nav":{"global":{"anchors":[{"anchor":"Contact us","icon":"headset","href":"https://backstage.spotify.com/contact-us/talk-to-us/"}]},"tabs":[{"tab":"Portal","pages":[{"title":"Portal","href":"/portal"}]},{"tab":"Plugins","pages":[{"title":"Spotify Plugins for Backstage","href":"/plugins"},{"group":"Getting Started","root":{"title":"Getting Started Guide","sidebarTitle":"Getting started with Plugins for Backstage","href":"/plugins/getting-started/index"},"pages":[{"title":"AWS Marketplace","sidebarTitle":"Buy Plugins on AWS Marketplace","href":"/plugins/getting-started/aws-marketplace"}]},{"group":"Soundcheck","root":{"title":"Soundcheck","sidebarTitle":"Overview","href":"/plugins/soundcheck/index"},"pages":[{"title":"Installation \u0026 Setup","href":"/plugins/soundcheck/setup-and-installation"},{"group":"Core Concepts","root":{"title":"Core Concepts","href":"/plugins/soundcheck/core-concepts/index"},"pages":[{"group":"Checks","root":{"title":"Checks","sidebarTitle":"Overview","href":"/plugins/soundcheck/core-concepts/checks/index"},"pages":[{"title":"Manual Checks","href":"/plugins/soundcheck/core-concepts/checks/manual-checks"},{"title":"Multi-Fact Checks","sidebarTitle":"Multi-Fact Checks","href":"/plugins/soundcheck/core-concepts/checks/multi-fact-checks"},{"title":"Check Exemptions","sidebarTitle":"Check Exemptions","href":"/plugins/soundcheck/core-concepts/checks/check-exemptions"}]},{"title":"Tracks","href":"/plugins/soundcheck/core-concepts/tracks"},{"title":"Campaigns","href":"/plugins/soundcheck/core-concepts/campaigns"},{"title":"Filters","href":"/plugins/soundcheck/core-concepts/filters"},{"title":"Check Results","href":"/plugins/soundcheck/core-concepts/checkResults"},{"group":"Fact Collectors","root":{"title":"Fact Collectors","sidebarTitle":"Overview","href":"/plugins/soundcheck/core-concepts/fact-collectors/index"},"pages":[{"group":"Integrations","pages":[{"title":"Azure DevOps","href":"/plugins/soundcheck/core-concepts/fact-collectors/3p-integrations/azure"},{"title":"BigQuery","sidebarTitle":"BigQuery","href":"/plugins/soundcheck/core-concepts/fact-collectors/3p-integrations/bigquery"},{"title":"Catalog","sidebarTitle":"Catalog","href":"/plugins/soundcheck/core-concepts/fact-collectors/3p-integrations/catalog"},{"title":"Datadog","href":"/plugins/soundcheck/core-concepts/fact-collectors/3p-integrations/datadog"},{"title":"Data Registry","sidebarTitle":"Data Registry (Portal)","href":"/plugins/soundcheck/core-concepts/fact-collectors/3p-integrations/data-registry"},{"title":"GitHub","href":"/plugins/soundcheck/core-concepts/fact-collectors/3p-integrations/github"},{"title":"GitLab","href":"/plugins/soundcheck/core-concepts/fact-collectors/3p-integrations/gitlab"},{"title":"HTTP","sidebarTitle":"HTTP","href":"/plugins/soundcheck/core-concepts/fact-collectors/3p-integrations/http"},{"title":"Jira","sidebarTitle":"Jira","href":"/plugins/soundcheck/core-concepts/fact-collectors/3p-integrations/jira"},{"title":"Kubernetes","href":"/plugins/soundcheck/core-concepts/fact-collectors/3p-integrations/kubernetes"},{"title":"NewRelic","href":"/plugins/soundcheck/core-concepts/fact-collectors/3p-integrations/newrelic"},{"title":"PagerDuty","href":"/plugins/soundcheck/core-concepts/fact-collectors/3p-integrations/pagerduty"},{"title":"Source Control Management","href":"/plugins/soundcheck/core-concepts/fact-collectors/3p-integrations/scm"},{"title":"SonarQube","href":"/plugins/soundcheck/core-concepts/fact-collectors/3p-integrations/sonarqube"},{"title":"Soundcheck","href":"/plugins/soundcheck/core-concepts/fact-collectors/3p-integrations/soundcheck"},{"title":"Tech Insights","href":"/plugins/soundcheck/core-concepts/fact-collectors/3p-integrations/techinsights"}]}]},{"title":"Check Insights Page Overview","sidebarTitle":"Check Insights","href":"/plugins/soundcheck/core-concepts/check-insights"},{"title":"Track Insights Page Overview","sidebarTitle":"Track Insights","href":"/plugins/soundcheck/core-concepts/track-insights"},{"title":"Campaign Insights Page Overview","sidebarTitle":"Campaign Insights","href":"/plugins/soundcheck/core-concepts/campaign-insights"},{"title":"Tech Insights","sidebarTitle":"Tech Insights","href":"/plugins/soundcheck/core-concepts/tech-insights"},{"title":"Events","description":"Enable Soundcheck to emit CheckStatusChange and CertificationChange events to the Backstage events plugin for downstream automation.","href":"/plugins/soundcheck/core-concepts/events"},{"title":"Notifications","href":"/plugins/soundcheck/core-concepts/notifications"}]},{"group":"Using Soundcheck","pages":[{"title":"Entity Card","description":"Configure the Soundcheck Entity Card to display track badge levels and technical health summaries on a Backstage entity overview page.","href":"/plugins/soundcheck/soundcheck-elements/soundcheck-entity-card"},{"title":"Entity Tab","href":"/plugins/soundcheck/soundcheck-elements/soundcheck-entity-tab"}]},{"group":"Tutorials","pages":[{"title":"Creating a Custom Third-Party Integration","href":"/plugins/soundcheck/tutorials/custom-fact-collector"},{"title":"Creating a Custom No-Code UI for a Third-Party Integration","href":"/plugins/soundcheck/tutorials/custom-fact-collector-ncui"},{"title":"Start Measuring Catalog Maturity in 1 hour with the SCM Compliance Track","href":"/plugins/soundcheck/tutorials/start-measuring-catalog-maturity"},{"title":"Climb the maturity ladder with the Recommended Source Control Track","href":"/plugins/soundcheck/tutorials/climb-the-maturity-ladder-with-the-recommended-source-control-track"},{"title":"Start to enable your experts to manage maturity progress","href":"/plugins/soundcheck/tutorials/start-to-enable-your-experts-to-manage-maturity-progress"}]},{"group":"API Reference","pages":[{"group":"Campaigns","pages":[{"title":"Get campaigns","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml get /campaigns","href":"/plugins/soundcheck/api-reference/campaigns/get-campaigns"},{"title":"Create campaigns","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml post /campaigns","href":"/plugins/soundcheck/api-reference/campaigns/create-campaigns"},{"title":"Get campaign entities","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml post /campaigns/entities","href":"/plugins/soundcheck/api-reference/campaigns/get-campaign-entities"},{"title":"Get a campaign","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml get /campaigns/{campaignId}","href":"/plugins/soundcheck/api-reference/campaigns/get-a-campaign"},{"title":"Update a campaign","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml put /campaigns/{campaignId}","href":"/plugins/soundcheck/api-reference/campaigns/update-a-campaign"},{"title":"Delete a campaign","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml delete /campaigns/{campaignId}","href":"/plugins/soundcheck/api-reference/campaigns/delete-a-campaign"}]},{"group":"Certification","pages":[{"title":"Get certifications for an entity","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml get /certifications","href":"/plugins/soundcheck/api-reference/certification/get-certifications-for-an-entity"},{"title":"Certify world","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml post /certify_world","href":"/plugins/soundcheck/api-reference/certification/certify-world"}]},{"group":"Checks","pages":[{"title":"Get checks","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml get /checks","href":"/plugins/soundcheck/api-reference/checks/get-checks"},{"title":"Create checks","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml post /checks","href":"/plugins/soundcheck/api-reference/checks/create-checks"},{"title":"Get check entities","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml post /checks/entities","href":"/plugins/soundcheck/api-reference/checks/get-check-entities"},{"title":"Execute checks","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml post /checks/execute","href":"/plugins/soundcheck/api-reference/checks/execute-checks"},{"title":"Get exemptions","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml get /checks/exemptions","href":"/plugins/soundcheck/api-reference/checks/get-exemptions"},{"title":"Create an exemption","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml post /checks/exemptions","href":"/plugins/soundcheck/api-reference/checks/create-an-exemption"},{"title":"Revoke an exemption","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml post /checks/exemptions/revoke","href":"/plugins/soundcheck/api-reference/checks/revoke-an-exemption"},{"title":"Restore a revoked exemption","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml post /checks/exemptions/restore","href":"/plugins/soundcheck/api-reference/checks/restore-a-revoked-exemption"},{"title":"Get revoked exemptions","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml get /checks/exemptions/revoked","href":"/plugins/soundcheck/api-reference/checks/get-revoked-exemptions"},{"title":"Get a check","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml get /checks/{checkId}","href":"/plugins/soundcheck/api-reference/checks/get-a-check"},{"title":"Update a check","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml put /checks/{checkId}","href":"/plugins/soundcheck/api-reference/checks/update-a-check"},{"title":"Delete a check","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml delete /checks/{checkId}","href":"/plugins/soundcheck/api-reference/checks/delete-a-check"},{"title":"Get the aggregate status of a check","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml get /checks/{checkId}/status","href":"/plugins/soundcheck/api-reference/checks/get-the-aggregate-status-of-a-check"},{"title":"Get the aggregate status of a check","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml post /checks/{checkId}/status","href":"/plugins/soundcheck/api-reference/checks/get-the-aggregate-status-of-a-check-1"},{"title":"Get the status history of a check","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml get /checks/{checkId}/status-history","href":"/plugins/soundcheck/api-reference/checks/get-the-status-history-of-a-check"},{"title":"Get the status history of a check","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml post /checks/{checkId}/status-history","href":"/plugins/soundcheck/api-reference/checks/get-the-status-history-of-a-check-1"}]},{"group":"FactCollectors","pages":[{"title":"List fact collectors","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml get /fact-collectors","href":"/plugins/soundcheck/api-reference/factcollectors/list-fact-collectors"},{"title":"Create fact collectors","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml post /fact-collectors","href":"/plugins/soundcheck/api-reference/factcollectors/create-fact-collectors"},{"title":"Get a fact collector","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml get /fact-collectors/{collectorId}","href":"/plugins/soundcheck/api-reference/factcollectors/get-a-fact-collector"},{"title":"Update a fact collector","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml put /fact-collectors/{collectorId}","href":"/plugins/soundcheck/api-reference/factcollectors/update-a-fact-collector"},{"title":"Delete a fact collector","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml delete /fact-collectors/{collectorId}","href":"/plugins/soundcheck/api-reference/factcollectors/delete-a-fact-collector"}]},{"group":"Facts","pages":[{"title":"Submit facts","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml post /facts","href":"/plugins/soundcheck/api-reference/facts/submit-facts"},{"title":"Trigger on-demand fact collection","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml post /facts/collect","href":"/plugins/soundcheck/api-reference/facts/trigger-on-demand-fact-collection"}]},{"group":"CheckResults","pages":[{"title":"Get check results","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml get /results","href":"/plugins/soundcheck/api-reference/checkresults/get-check-results"},{"title":"Submit check results","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml post /results","href":"/plugins/soundcheck/api-reference/checkresults/submit-check-results"},{"title":"Delete check results","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml delete /results","href":"/plugins/soundcheck/api-reference/checkresults/delete-check-results"}]},{"group":"Tracks","pages":[{"title":"Get tracks","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml get /tracks","href":"/plugins/soundcheck/api-reference/tracks/get-tracks"},{"title":"Create tracks","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml post /tracks","href":"/plugins/soundcheck/api-reference/tracks/create-tracks"},{"title":"Get a track","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml get /tracks/{trackId}","href":"/plugins/soundcheck/api-reference/tracks/get-a-track"},{"title":"Update a track","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml put /tracks/{trackId}","href":"/plugins/soundcheck/api-reference/tracks/update-a-track"},{"title":"Delete a track","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml delete /tracks/{trackId}","href":"/plugins/soundcheck/api-reference/tracks/delete-a-track"},{"title":"Get entities for a track filtered by certification status","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml get /tracks/{trackId}/entities","href":"/plugins/soundcheck/api-reference/tracks/get-entities-for-a-track-filtered-by-certification-status"},{"title":"Get entities failing checks in a track","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml post /tracks/{trackId}/failing-entities","href":"/plugins/soundcheck/api-reference/tracks/get-entities-failing-checks-in-a-track"},{"title":"Get the aggregate certification status for a track","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml get /tracks/{trackId}/status","href":"/plugins/soundcheck/api-reference/tracks/get-the-aggregate-certification-status-for-a-track"},{"title":"Get the aggregate certification status for a track","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml post /tracks/{trackId}/status","href":"/plugins/soundcheck/api-reference/tracks/get-the-aggregate-certification-status-for-a-track-1"},{"title":"Get the aggregate certification status history of a track","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml get /tracks/{trackId}/status-history","href":"/plugins/soundcheck/api-reference/tracks/get-the-aggregate-certification-status-history-of-a-track"},{"title":"Get the aggregate certification status history of a track","deprecated":null,"version":null,"openapi":"/plugins/soundcheck/openapi.yaml post /tracks/{trackId}/status-history","href":"/plugins/soundcheck/api-reference/tracks/get-the-aggregate-certification-status-history-of-a-track-1"}]}]},{"title":"API Client","sidebarTitle":"API Client","href":"/plugins/soundcheck/api-client"},{"title":"MCP Actions","href":"/plugins/soundcheck/mcp-actions"},{"title":"Health Page","sidebarTitle":"Health Page","href":"/plugins/soundcheck/health"},{"title":"Soundcheck - Advanced Performance Tuning","sidebarTitle":"Advanced Performance Tuning","href":"/plugins/soundcheck/performance"},{"title":"Internationalization (i18n)","sidebarTitle":"Internationalization","href":"/plugins/soundcheck/internationalization"},{"group":"Troubleshooting","root":{"title":"Troubleshooting","href":"/plugins/soundcheck/troubleshooting/index"},"pages":[{"title":"Job Queue Statistics","href":"/plugins/soundcheck/troubleshooting/job-queue-statistics"}]}]},{"group":"RBAC","root":{"title":"RBAC","sidebarTitle":"Overview","href":"/plugins/rbac/index"},"pages":[{"title":"Installation \u0026 Setup","sidebarTitle":"Setup \u0026 Installation","href":"/plugins/rbac/setup-and-installation"},{"title":"Core Concepts","href":"/plugins/rbac/core-concepts"},{"title":"MCP Actions","href":"/plugins/rbac/mcp-actions"},{"group":"Tutorials","pages":[{"title":"Fine-tune Software Templates Access","href":"/plugins/rbac/tutorials/fine-tune-template-access"},{"title":"Read-Only Catalog Permissions","href":"/plugins/rbac/tutorials/read-only-catalog"},{"title":"Catalog Delete Permissions","href":"/plugins/rbac/tutorials/delete-catalog-for-owners"},{"title":"Establish a foundational permission policy","href":"/plugins/rbac/tutorials/foundational-permission-policy"}]}]},{"group":"Skill Exchange","root":{"title":"Skill Exchange","sidebarTitle":"Overview","href":"/plugins/skill-exchange/index"},"pages":[{"title":"Setup \u0026 Installation","href":"/plugins/skill-exchange/setup-and-installation"},{"title":"Notifications","sidebarTitle":"Notifications","href":"/plugins/skill-exchange/notifications"},{"title":"Skill Exchange Actions","href":"/plugins/skill-exchange/actions"},{"group":"Tutorials","pages":[{"title":"Customizing Skill Exchange","href":"/plugins/skill-exchange/tutorials/customizing-skill-exchange"}]},{"group":"References","pages":[{"title":"EmbedsMessageBuilder","href":"/plugins/skill-exchange/references/EmbedsMessageBuilder"},{"title":"MentorsMessageBuilder","href":"/plugins/skill-exchange/references/MentorsMessageBuilder"},{"title":"HacksMessageBuilder","href":"/plugins/skill-exchange/references/HacksMessageBuilder"}]}]},{"group":"Insights","root":{"sidebarTitle":"Insights","title":"Overview","href":"/plugins/insights/index"},"pages":[{"title":"Setup \u0026 Installation","sidebarTitle":"Setup \u0026 Installation","href":"/plugins/insights/setup-and-installation"},{"group":"Core Concepts","pages":[{"title":"Usage Data","href":"/plugins/insights/core-concepts/usage-data"},{"title":"Feedback","href":"/plugins/insights/core-concepts/feedback"}]},{"title":"Migration \u0026 Installation","sidebarTitle":"Migrating to Insights with Feedback","href":"/plugins/insights/migrating-to-insights-with-feedback"},{"title":"MCP Actions","href":"/plugins/insights/mcp-actions"},{"group":"Tutorials","pages":[{"title":"Optimizing your Insights configuration","href":"/plugins/insights/tutorials/Optimizing-Insights-set-up"},{"title":"Tips for running your first Feedback Survey","href":"/plugins/insights/tutorials/feedback-survey"}]}]}]},{"tab":"Xirp","pages":[{"title":"Xirp","href":"/xirp"}]}]},"basePath":"","title":"Notifications - Spotify for Backstage","buildId":"dpl_AHzSCQPRq6mP9FZXEa5AbDZTffie","deploymentId":"dpl_AHzSCQPRq6mP9FZXEa5AbDZTffie","dynamics":[],"chunks":[]}