Integrations
What this screen is for
The Integrations tab connects Fenwave to third-party services your teams use outside the platform. Today that means Jira and Slack.
Unlike CI/CD, which connects the tools that build and deploy, these integrations enrich what happens around a deployment — issue links, tracking and notifications rather than execution.
Each integration is configured once, platform-wide. One Jira instance, one Slack workspace, shared by every plugin that needs them.
Before you start
| To do this | You need |
|---|---|
| See the tab | platform-settings.project.read |
| Configure or disable an integration | platform-settings.project.update |
Integrations reuse the project permissions rather than having their own family. If you can edit projects, you can configure integrations.
Opening it
- Settings › Development
- Select the Integrations tab.
The interface
📸 Screenshot Placeholder: The Integrations tab with the Jira and Slack rows. Mark: (1) the integration name, (2) the status chip reading Connected, Failing, or Disabled, (3) the configure action.
| # | Control | What it does | When you’d use it |
|---|---|---|---|
| 1 | Integration name and description | What the integration does | Deciding whether you need it |
| 2 | Status chip | Connected, Failing, or Disabled | Triage at a glance |
| 3 | Configure | Opens the credentials dialog | Setting up, or fixing a failure |
What the statuses mean
| Status | Means | Do |
|---|---|---|
| Connected | Credentials were verified when saved and are working | Nothing |
| Failing | Configured, but the service is not responding as expected | Reconfigure — usually expired credentials |
| Disabled | Deliberately switched off, or never configured | Configure it, if you want it |
Credentials are verified at save time. A save that succeeds tells you the credentials worked at that moment — which is why Failing appears later rather than at setup.
Walkthroughs
Connect Jira
Requires platform-settings.project.update.
- Settings › Development › Integrations.
- Open the Jira row and configure it.
- Enter the connection details and credentials.
- Save. The confirmation states explicitly that the credentials were verified; if it does not, they were not.
- Confirm the status chip reads Connected.
Connect Slack
Requires platform-settings.project.update.
Slack posts platform notifications — deployments finishing on dev, staging and production, and anything else a plugin chooses to announce.
Do the Slack-side setup first, at https://api.slack.com/apps:
- Create a Slack app for your workspace.
- Under OAuth & Permissions, add the
chat:writebot scope, then install the app to the workspace. - Copy the Bot User OAuth Token — it starts with
xoxb-. - Invite the app to every channel you plan to use, by typing
/invite @your-appin each one.
Step 4 is the one people skip. chat:write lets the app post, but Slack still
refuses if the app is not a member of the channel — and because notifications
fail quietly, the symptom is silence rather than an error.
Then in Fenwave:
- Settings › Development › Integrations.
- Open the Slack row and configure it.
- Paste the bot token and set the channels.
- Save. The token is verified against Slack as part of saving.
- Confirm the status chip reads Connected.
Faster: create the app from a manifest
Slack’s Create New App dialog offers From an app manifest. Pasting this replaces steps 1 and 2 and avoids the two settings people miss — the bot user, without which Slack never issues a token at all, and token rotation, which would make notifications stop working a few hours after setup.
_metadata:
major_version: 2
minor_version: 1
display_information:
name: Fenwave
description: Deployment and platform notifications from your Fenwave IDP
background_color: "#1a1d23"
features:
bot_user:
display_name: Fenwave
always_online: true
oauth_config:
scopes:
bot:
- chat:write
settings:
org_deploy_enabled: false
socket_mode_enabled: false
token_rotation_enabled: false
You still need to install the app, copy the token, and invite it to your channels.
Choosing channels
| Field | Used for |
|---|---|
| Default | Anything with no environment channel. Required. |
| Dev | Branch environments |
| Staging | Staging deployments |
| Production | Production deployments |
Leave the environment fields blank to send everything to the default channel. Fill them in when different audiences care about different environments — production announcements in a channel the whole team watches, dev churn in one they can mute.
Why a bot token and not a webhook URL
A Slack incoming webhook is permanently bound to one channel. Routing dev, staging and production to different places requires a bot token.
Disable an integration
Requires platform-settings.project.update.
Disable it from the same dialog. The configuration is kept, so re-enabling later does not mean re-entering everything.
Scenario
Jira links stopped resolving after a credential rotation.
Nobody changed anything in Fenwave, which is the tell.
- Settings › Development › Integrations.
- The Jira status chip reads Failing — so it is configured, and the problem is the credentials rather than the setup.
- Open the configuration and enter the new credentials.
- Save. Verification runs as part of saving, so a successful save is your proof.
- Confirm the chip returns to Connected.
The general lesson: Failing means “was working, no longer is”, and points at credentials. Disabled means “never set up”, and points at configuration. Reading the chip correctly saves you starting in the wrong place.
Slack says Connected, but no notifications arrive.
The chip is telling the truth, and it is not the whole story. Connected means the token was verified. It says nothing about the channels — those are only tested when a real notification is sent.
Two causes, in order of likelihood:
- The app was never invited to the channel. Open the channel in Slack and
type
/invite @your-app. This is by far the most common cause. - The channel name is wrong — a typo, a renamed channel, or a private channel the app cannot see.
Either way the failure is recorded in the backend logs rather than on screen,
because a notification must never fail the deployment that triggered it. Look
for not_in_channel (cause 1) or channel_not_found (cause 2).
The general lesson: a verified integration is not the same as a working delivery path. Verification proves the credential; only a real notification proves the route.
When it doesn’t work
| Symptom | Cause | How to check | Fix |
|---|---|---|---|
| Status reads Failing | Credentials expired or the service is unreachable | Reconfigure and save | Enter fresh credentials; verification runs on save |
| Save is rejected | Credentials did not verify | The error in the dialog | Correct them — nothing is stored on a failed verification |
| Status reads Disabled unexpectedly | Someone disabled it, or it was never configured | The configuration dialog | Re-enable; stored settings are kept |
| Cannot configure anything | Missing platform-settings.project.update |
Access Explorer | Ask for a role granting it |
| Slack is Connected but silent | The app is not in the channel | Backend logs for not_in_channel |
/invite @your-app in each configured channel |
| Slack notifications go to one channel | Environment channels are blank | The Slack configuration dialog | Fill in the Dev, Staging and Production fields |
| The Slack token is rejected on save | It is a user token, not a bot token | The error in the dialog | Use the Bot User OAuth Token — it starts with xoxb- |
| The integration you want is not listed | Only Jira and Slack are available today | — | Not configurable; nothing to enable |