# Feedback routing

> Send incoming feedback to email, Slack, Linear or GitHub, and anywhere else with a webhook.

When a user submits feedback to `POST /v1/feedback`, Nordva Launch does three things in one call:

1. **Classifies** the text into `bug`, `feature_request`, `praise`, `billing`, `support`, or `uncategorised`. On Indie and up an AI model does it, with a one-line summary, up to the plan's monthly allowance (Indie 500, Builder 3,000). On Free (50 messages a month per project), and past that allowance, a keyword matcher does it, with no summary and nothing sent to a model.
2. **Persists** it under your project.
3. **Routes** it to one or more destinations you've configured.

This page covers (3).

## Configure a destination

One destination per call, with its own fields beside `destination`. Saving the same destination again replaces it.

```bash
curl -X POST https://api.nordva.dev/v1/feedback/routing/slack \
  -H "Authorization: Bearer nv_live_sk_..." \
  -H "Content-Type: application/json" \
  -d '{
    "destination": "slack",
    "webhook_url": "https://hooks.slack.com/services/T.../B.../...",
    "categories": ["bug"]
  }'
```

| Destination | Fields |
| --- | --- |
| `email` | `destination_email` |
| `slack` | `webhook_url` |
| `linear` | `api_key`, `team_id`; optional `label_map`, `assignee_id` |
| `github` | `personal_access_token`, `owner`, `repo`; optional `label_map`, `assignee` |

`GET /v1/feedback/routing` lists what is set up, `DELETE /v1/feedback/routing/<destination>` removes one. In the dashboard it is **Feedback Routing**; an AI agent uses `configure_feedback_routing`, `get_feedback_routing` and `remove_feedback_routing`.

## Destinations by plan

| Destination | Free | Indie | Builder |
| --- | --- | --- | --- |
| `email` | ✓ | ✓ | ✓ |
| `slack` |   | ✓ | ✓ |
| `linear` |   | ✓ | ✓ |
| `github` |   | ✓ | ✓ |

For anything else (Discord, your own server), use an [outgoing webhook](/guides/webhooks/) on the `feedback.created` event, from Indie.

## Only some categories

`categories` sends only those classifications to that destination, for example `["bug"]` to Linear and `["feature_request", "praise"]` to Slack. Leave it out (or send `null`) and the destination gets every category. In the dashboard, tick the categories when you add the destination. Feedback in other categories is not sent there and does not count as a failure.

## The hosted feedback form

Feedback from the [hosted form](/guides/feedback-react/#option-c-a-hosted-form-a-link) is routed only when you switch that on (**Send to the destinations below** under **Hosted form**, or `"route_hosted_feedback": true` on `PATCH /v1/project`). Otherwise it is stored and sent as the `feedback.created` webhook only.

## Encryption

Destination credentials (webhook URLs, OAuth tokens, etc.) are encrypted at rest with AES-GCM. They are never returned in `GET /v1/feedback/routing`; only a redacted summary is.

## Failure handling

If a destination call fails, the feedback row is still persisted and the API still returns 201 to your caller. Failed deliveries appear under `routing_results[<dest>]` in the response, and again in your daily activity log so you can retry or escalate.

Source: https://docs.nordva.dev/feedback-routing/
