Content Modules

Showing your feedback board in your app

Updated 90 views

Feedback in Kookee has two halves. Collection happens on your hosted portal, where visitors sign in, post ideas, vote and comment, and in the site widget's Feedback tab, where anyone can send a private message without an account. Your team triages both in the dashboard. Display is where the API comes in — everything on the board is readable with your API key, so you can show it anywhere.

The public API does not create posts, votes or comments; those stay on the portal so that each person counts once and your team's moderation applies. The one write is POST /v1/widget/feedback (kookee.widget.sendFeedback() in the SDK), which the site widget's Feedback tab uses. It sends a private message, not a post: the message waits on the Feedback page under From the widget until a team member adds it to the board, links it to an existing post, or dismisses it.

Listing posts

TypeScript
const response = await kookee.feedback.list({
  page: 1,
  limit: 20,
  sort: 'top',
  category: 'feature',
  search: 'dark mode',
});
  • sort — newest, top or trending

  • category — feature, improvement, bug or other

  • search — text search across post titles and bodies

Each list item carries voteCount, commentCount, category, the columnId of its board column and author. assignee is always null here: who a post is assigned to, like its custom fields, stays with your team.

Board columns

Posts live in columns your team defines on the board — typically something like Open, Planned, In progress, Shipped. Fetch the column list once, then group posts by columnId:

Bash
curl -H "Kookee-API-Key: YOUR_API_KEY" https://api.kookee.dev/v1/feedback/columns

Columns are yours to name and reorder in the dashboard; the API reflects whatever the board currently looks like. This is also what a public roadmap is built from — see Building a public roadmap, or render it in React with Roadmap from @kookee/react/roadmap.

A single post

TypeScript
const post = await kookee.feedback.getById('post-uuid');

post.contentHtml; // rich body
post.voteCount;

Comments for a post are a separate read:

Bash
curl -H "Kookee-API-Key: YOUR_API_KEY" https://api.kookee.dev/v1/feedback/POST_ID/comments

Comments carry an isOfficial flag for replies from your team. Render those distinctly — a visible reply from your team is the difference between a board that feels alive and one that looks abandoned.

Top contributors

TypeScript
const contributors = await kookee.feedback.getTopContributors({ limit: 5 });
// [{ id, name, image, totalVotes }, ...]

These are the people whose posts collected the most votes — the handful who consistently tell you the truth about your product. Worth knowing who they are, well beyond rendering a leaderboard.

Sending people to post

Since submission happens on the portal, link to it from wherever you display the board:

Plain Text
https://your-project-slug.kookee.dev/feedback

Deep-link a specific post with its id so a "discuss this" button lands on the right thread.

For people who will not sign in to the portal, the site widget's Feedback tab takes a message with no account, and KookeeChat.open('feedback') opens it from your own button. That message is private and waits for your team's review before anything reaches the board. See Collect feedback from your site widget.

Reading the votes honestly

Vote counts tell you what your most engaged users want. That is a real signal, and it is not the same as what your whole user base needs — treat it as input to prioritization rather than a substitute for it.

Keeping a board healthy

Respond in public, so people can see that posting is worth the effort. And move rejected ideas to a closed column with a reason rather than letting them sit in Open forever — a board where nothing is ever turned down stops being believable, and the silence reads as neglect.

Was this article helpful?