· 5 min read
How to Actually Collect Feedback From Your Users in 2026
The amount of feedback you get is mostly a function of how far someone has to walk to give it. Here is where to put the button, and why "email us" quietly loses you most of it.
Ask a room of founders how they collect feedback and most will say some version of "people email us". Ask how many pieces of feedback they got last month and the number is usually single digits — for a product with thousands of users.
That gap is not because your users have no opinions. It is because the distance between having an opinion and successfully delivering it to you is much longer than you think, and almost everyone gives up somewhere along it.
The rule: feedback is a function of distance
Every step between the moment of friction and the moment of telling you costs you a share of the people who would have said something. Opening a new tab. Finding your contact page. Composing a subject line. Deciding whether this is "worth bothering them about" — that one alone eliminates most of it, because the person who hit a small annoyance has already decided it is too small to write an email about, and small annoyances are what compound into churn.
So the whole job is shortening that distance. Everything below is a way of doing that.
Put the button inside the product
Your dashboard is where people are when they form opinions. A feedback link on your marketing site collects feedback from people who are not currently using the product, which is the wrong population.
One script tag, then any element becomes a trigger — a button, a menu item, a link in your empty state:
<script src="https://feedfa.st/embed.js" data-project="your-project" defer></script>
<button data-feedfast="feedback">Send feedback</button>
It renders in a shadow root, so your CSS cannot reach into it and its styles cannot leak onto your page. If the payload never arrives, the button does nothing at all — your layout does not shift and nothing appears in the console.
On every page, in the same place
Put it in your app shell, not on a "Feedback" page. Two reasons.
The first is coverage: opinions form on the billing screen, the empty state, the one report that is slow — not on the page you built for collecting opinions.
The second is muscle memory. A control that lives in the same corner on every screen becomes something people know is there without looking. A control that moves, or exists on one page, has to be found each time, and finding things is exactly the cost we are trying to remove.
The same button can arrive pre-filled. On an error state, open it with the subject already written — the report you get back is far more specific, and the person spends five seconds instead of sixty.
Feedfast.openFeedback({ title: "Export failed" });
Make it visible — but not loud
"Visible" gets misread as "big". The floating badge and the feedback trigger work because they are consistently present, not because they shout.
A few things that reliably kill visibility:
- Burying it in a profile menu. Two clicks and a memory test.
- Calling it "Support". People with a feature request will not click Support, because they do not have a problem — they have an idea.
- Only showing it on hover. Invisible on touch, which is most of your traffic on marketing pages and a growing share in-app.
- Putting it where your cookie banner sits. Check the corner is actually free on a phone before you commit to it.
Label it for what you want back. "Send feedback" gets you feedback. "Report a bug" gets you bugs. If you want both, say both — or use the categories to ask the question for you.
Why "just email us" quietly loses
Email feels like the zero-effort option because there is nothing to build. It costs more than it looks like it does.
It is one-to-one, so nothing accumulates. Eleven people asking for the same
have no way to know it is the same request, and no number to weigh it against anything else.
Nobody else can see it. The twelfth person cannot tell that eleven people already asked, so they either write the same email again or — far more often — assume nobody is listening and say nothing.
There is no state. An email you have read but not acted on looks exactly like an email you never saw. The sender has no way to tell the difference, so they conclude the worst.
It dies in your inbox. Feature requests do not survive contact with an inbox that also contains invoices, alerts and a password reset.
It asks for identity up front. Plenty of useful feedback comes from people who will not attach their name to it, and an email forces them to.
A board fixes each of those with the same move: it makes feedback public and countable. Votes turn eleven emails into one request with a number on it. Statuses tell the eleven people where it stands without you writing to any of them. And the next person can see that asking works before they decide whether to bother.
Email still has a place — for the reply that matters, or the conversation that needs to be private. It is a bad intake channel and a fine response one.
Then keep track of it
Collecting is the easy half. What decides whether any of it turns into product is whether you can see the board in a way that answers a question.
From the dashboard, filter by category and status, and sort by top votes, newest, or trending — trending being votes in the last seven days, which is the one that tells you what changed recently rather than what has been quietly accumulating since launch. Every filter lives in the URL, so a view like "open bugs, most voted" is a link you can bookmark or paste to someone else.
From your editor, if you would rather not open a browser at all. FeedFast ships an MCP server, so an AI agent can read and act on the board directly:
What are the top open feature requests this month?
Mark the CSV export request as done and reply with a link to the release
Behind those, list_feedback filters and sorts the board, get_feedback pulls
a single post with its comments, update_feedback changes status or category,
and resolve_feedback closes the loop in one call — marks it Done, publishes a
changelog entry, and posts a public reply that links to it.
The MCP server is a client of the same public REST API, holding no database connection of its own. A read-only key stays read-only through an agent exactly as it would through curl, which is what makes it reasonable to point a model at your feedback board at all.
The short version
- Put the trigger in your app shell, on every page, in a fixed spot
- Label it for what you want back
- Pre-fill it where you already know the context
- Stop routing intake through email
- Read the board by votes and trending, not chronologically
- Answer with a status, then close the loop when you ship
The products that get useful volumes of feedback are almost never the ones that asked more insistently. They are the ones where saying something took four seconds and visibly went somewhere.