Skip to content

Feedback routing

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).

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

Terminal window
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"]
}'
DestinationFields
emaildestination_email
slackwebhook_url
linearapi_key, team_id; optional label_map, assignee_id
githubpersonal_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.

DestinationFreeIndieBuilder
email✓✓✓
slack✓✓
linear✓✓
github✓✓

For anything else (Discord, your own server), use an outgoing webhook on the feedback.created event, from Indie.

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.

Feedback from the hosted form 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.

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.

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.