← Widgets

A suggestion form nobody needs an account for

A suggestion form widget with no account behind it is the one nobody has to go anywhere to use. Not a link to a portal, not an email address somebody has to compose a message to, and not a form that asks who you are before it asks what you think.

This is a modal. It opens over whatever page the visitor is already on, takes the idea, and closes again.

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 you can recognise the same person without them ever having told you 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 lifted and used against a different board.

One thing the visitor cannot do is get past a ban. If you have banned that identity, the request is refused with its own error rather than quietly accepted and dropped, so a banned person finds out and you do not end up moderating the same thing twice.

The snippet above is the whole integration once you have a key, and a trial is 14 days, a card, then $9 or $39 a month.

The voter list, one row per person, showing where each arrived from and how many requests and comments they have left
Everyone who voted, one row each, no account required.

What is the line you paste?

Two tags, one call, and whatever control you want to open it.

<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 you like, so a menu item, a link in a footer or a keyboard shortcut all work the same way. There is a second modal for bug reports, being VoteFirst.report, which takes the same options. Both popups are documented with their options and the events they emit.

What does the form actually ask for?

Two things, and both are required. A single line for what they want, and a longer box for why.

The first is a text input capped at 254 characters. The second is a textarea capped at 2,000. Neither cap is decoration.

The control stops you typing past it 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.

It is worth knowing that this is two fields rather than one, because the temptation with a modal in a checkout flow is to reach for a single box. If a bare one line comment is what you want, this is not the widget for it.

What you get instead is a request with a title you can read in a list of forty, which is the difference between a queue you can work through and a pile you cannot.

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.

Every route into the product works this way, including this form, and there is no setting to turn it off. We looked for one before writing that sentence, because it is the first thing somebody running a busy board will want.

The visitor is told this before they type, not after they submit. The dialog carries a line saying the suggestion will be read first, and it is part of the form rather than a confirmation screen, which is the honest way round.

That is the trade. You get a board where nothing embarrassing appears without a person seeing it first, and you get a queue that is genuinely your work to do.

How will you know a suggestion is waiting?

By looking, and this is the part worth reading twice.

When a suggestion arrives, the project owner is emailed. Only the owner, not the rest of your team, and only if email is configured on the installation.

That notice is an ordinary product email rather than a transactional one, so it goes through the same daily ceiling everything else does, which is one product email per address per day.

If a hundred suggestions arrive on a Monday, you get one email about it, not a hundred, and the other ninety nine are recorded as skipped rather than queued for tomorrow.

We would rather write that down than let you discover it. The inbox is a nudge and the pending queue is the record, so if suggestions matter to you, the habit to build is opening the board rather than waiting to be told.

14 days, a card at signup, then $9 or $39 a month.

The public board a visitor reads, three columns wide, each request carrying its vote count, its views and its comment count
The public board, where anyone can post and vote without an account.

When should I use this instead of the board widget?

When you want an idea and you do not want a conversation.

The board widget shows people what has already been suggested so they can vote instead of repeating it, and that is usually the better choice. This one is for the places where showing a board would be wrong. A checkout flow, an onboarding step, an error state, a help panel. Somewhere the visitor is in the middle of something and you want their request without derailing it.

If you are choosing between the two and unsure, use the board widget. Fewer duplicates, and the visitor learns something.

The roadmap widget embedded in an ordinary web page, drawing the board's columns as a grid of cards
The roadmap widget running inside an ordinary web page.

Can I turn it off without turning off the board?

Yes, and this catches people out, so it is worth saying plainly.

A suggestion through this widget needs two separate switches to be on. The one that governs the roadmap's own suggestion form, and the one that governs the board.

Either of them off and the widget is refused, which means you can run a public roadmap that accepts suggestions while this modal accepts nothing, or the other way round.

That is deliberate rather than accidental. The widget sits inside your own product and the roadmap sits on a public page, and those are different audiences who can reasonably be trusted differently.

The private board, with Pending approval holding four suggestions nobody has let through yet, Suggested beside it and Denied with the reason written on each card
The private board, where every new suggestion waits for approval.

Can I change the wording?

Yes, without touching the script, and in two ways depending on how much you want to change.

Every string has a key, and the keys are listed in a companion file next to the SDK, so you can override the ones you want in one place for every widget on the page.

If you only want this one dialog to read differently, the labels and the placeholder text for both fields can be passed straight into the call instead.

That matters more on this widget than the others, because a suggestion form is the one place your product's own voice should be doing the talking rather than ours.

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. If what you are building is a suggestion box rather than a feature request form, the ideas that make one work are listed separately.

How do I install it?

One script tag with your project and your public key, then open the modal from whatever control you like, a button, a menu item, a keyboard shortcut.

The trigger can be a CSS selector or an element you already have, and tearing the widget down unbinds the listener as well as closing the dialog, so calling it twice does not leave you with two dialogs opening on one press.

Calls made before the script has finished loading queue instead of failing, which matters here because the trigger is usually inside your own application rather than sitting on the page waiting.

One last thing, for anyone using the same component to collect 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 rather than being added past it, so the box shrinks to leave room and never below 200 characters.

You can switch the appending off if you would rather have the whole budget for the words.

Related reading

A feedback widget that shows the board, not just a form A vote button for one feature, inside your product