A suggestion form widget with no account behind it is the one nobody has to go anywhere to use. VoteFirst.suggest opens a modal over whatever page the visitor is already on, takes the idea, and closes again. There is a second one for bug reports, VoteFirst.report, which takes the same options.
Does the visitor need an account?
No. They type the idea and send it.
An anonymous identity is minted in their own browser the first time they write something, so if they come back the same board recognises them without their ever having said who they are. No cookies are involved and nothing is sent with credentials. That identity is signed and tied to your project specifically, so it cannot be used against a different board.
If you have banned that identity, the request is refused with its own error rather than quietly accepted and dropped.
What is the line you paste?
<link rel="stylesheet" href="https://app.votefirst.app/embed/votefirst.css">
<script src="https://app.votefirst.app/embed/votefirst.js"></script>
<script>
VoteFirst.init({ project: 'your-project-slug', key: 'your-embed-key' });
VoteFirst.suggest({ trigger: '#suggest-btn' });
</script>
<button id="suggest-btn">Suggest a feature</button>
The trigger is any selector, so a menu item, a link in a footer or a keyboard shortcut all work the same way. Both popups are documented with their options and the events they emit. Calls made before the script has loaded queue rather than fail.
What does the form actually ask for?
Two things, both required: a single line for what they want, capped at 254 characters, and a longer box for why, capped at 2,000. The control stops typing past the cap and the server checks it again by byte count when the request arrives, so a paste full of emoji cannot slip past a limit that was counted in characters in the browser.
Control characters are stripped from both fields before anything is stored, with tab, newline and carriage return kept, so formatting survives and terminal escapes do not.
What happens to the idea after they send it?
It is held for review. It does not appear on your public board until you approve it, and there is no setting to turn that off. The dialog tells the visitor this before they type, as part of the form rather than as a confirmation screen afterward.
How will I know a suggestion is waiting?
The project owner is emailed, once a day at most, and only if email is configured on the installation. If a hundred suggestions arrive on a Monday, that is one email, not a hundred; the pending queue on the board is the complete record either way.
Can I run this inside my product without sending anyone to a portal?
Yes, that is the whole design of the modal. It opens over whatever screen the visitor is already on, takes the idea in two fields, and closes again, rather than sending them to a portal on a different domain. The trigger can be a button, a menu item or a keyboard shortcut.
When should I use this instead of the board widget?
When the goal is one idea rather than a conversation. The board widget shows a visitor what has already been suggested so they can vote instead of repeating it, which is usually the better choice. This form is for the places a board would be the wrong move: a checkout flow, an onboarding step, an error state, a help panel.
Can I turn it off without turning off the board?
Yes. A suggestion through this widget needs two separate switches: the one governing the board's own suggestion form, and the one governing the board. Either off and the widget is refused, so a public roadmap can accept suggestions while this modal accepts nothing, or the other way round.
Can I change the wording?
Yes, without touching the script. Every string has a key, listed in a companion file next to the SDK, for overriding once for every widget on the page. For just this dialog, the heading and the description can be passed straight into the call instead.
What does it cost?
Nothing beyond your plan. No widget is held back for the higher plan, so this works on the nine dollar plan.
How do I install it?
One script tag with your project and your public key, then open the modal from a button, a menu item or a keyboard shortcut. Tearing the widget down unbinds the trigger as well as closing the dialog, so calling it twice does not leave two dialogs opening on one press.
Using VoteFirst.report for bug reports: that form appends the page address and the browser string to what the reporter wrote, and the space for those comes out of the same 2,000 characters rather than being added past it, so the box shrinks to leave room and never below 200 characters. Pass context: false to leave the page address and the browser out of it.
14 days, a card at signup, then $9 or $39 a month.