Convert Release Changes into Clear, Structured Release Notes
Structured change data can be efficiently converted into consistent release notes with this workflow. Incoming data is received via webhook, validated, and automatically formatted as Markdown. Changes are grouped by type (Feature, Fix, Maintenance) and breaking changes are highlighted. Development teams benefit from time-saving, error-reducing, and traceable documentation that can be tailored to their own standards.
Development teams are empowered to generate release notes automatically from structured change data using this workflow. The process starts with a POST request to a webhook endpoint that expects an array of changes, each containing type, title, and optionally issue and breaking fields. Inputs are checked for completeness and correct types (feature, fix, maintenance). When data is valid, changes are grouped accordingly and a clear Markdown document is generated, emphasizing key updates and breaking changes. Invalid or incomplete entries are met with a clear error message. The output can be used directly or integrated into other systems. To prevent unauthorized access, webhook authentication must be enabled separately in n8n. Execution and data storage follow the n8n configuration. This workflow is especially suited for teams that regularly publish release notes and value consistency and efficiency. Custom formatting standards can be applied.
AI-generated image
Installation
1. Import the workflow into n8n.
2. Select the Webhook node and start the test listener.
3. Copy the displayed test URL for the webhook.
4. Send a POST request with Content-Type application/json and appropriate body to the test URL (see example below).
5. Check the response and, if successful, publish/activate the workflow.
6. After activation, use the production URL from the Webhook node.
7. Configure webhook authentication in n8n to secure access.
Usage
Example of a valid request:
```json
{
"changes": [
{"type": "feature", "title": "Neue Benutzeroberfläche", "issue": "#123"},
{"type": "fix", "title": "Login-Fehler behoben"},
{"type": "maintenance", "title": "Abhängigkeiten aktualisiert", "breaking": true}
]
}
```
Expected response:
```json
{
"status": "success",
"groups": {
"feature": [
{"type": "feature", "title": "Neue Benutzeroberfläche", "issue": "#123"}
],
"fix": [
{"type": "fix", "title": "Login-Fehler behoben"}
],
"maintenance": [
{"type": "maintenance", "title": "Abhängigkeiten aktualisiert", "breaking": true}
]
},
"breaking": [
{"type": "maintenance", "title": "Abhängigkeiten aktualisiert", "breaking": true}
],
"markdown": "# Release Notes\n\n## feature\n- Neue Benutzeroberfläche (#123)\n\n## fix\n- Login-Fehler behoben\n\n## maintenance\n- Abhängigkeiten aktualisiert\n\n## Breaking Changes\n- Abhängigkeiten aktualisiert"
}
```
Error case (empty changes array):
```json
{
"changes": []
}
```
Response:
```json
{
"status": "error",
"message": "changes muss ein nicht-leeres Array sein."
}
```
HTTP status: 200 (success), 200 (error, as explicitly implemented)
Notes:
- Fields type (feature, fix, maintenance) and title are mandatory.
- Optional: issue (e.g., ticket number), breaking (true/false).
- Webhook authentication must be enabled separately in n8n.
- Execution data can be stored in n8n; retention and access follow n8n configuration.
Required connections and APIs
API connections
No saved API credentials were detected in the workflow JSON. Still check webhooks, target systems, credentials, and data protection before activation.
Nodes
WebhookCodeRespond to Webhook
Isolated functional test passed
Optional isolated functional test
The isolated data flow was tested without external services or credentials.
✓ Standard case with complete dataChecks the complete standard flow with valid sample data.Isolated functional test passed✓ Variation or boundary caseChecks a valid variation or an important boundary case.Isolated functional test passed✓ Additional processing ruleChecks this workflow's additional business processing rule.Isolated functional test passed✓ Invalid or incomplete inputChecks that invalid or incomplete data is rejected safely.Isolated functional test passed✓ Empty inputChecks that an empty request receives a controlled response.Isolated functional test passed