Polls, surveys and quizzes you can embed anywhere, with results shown live and exports when the vote closes.
Build me a polls and surveys tool that replaces Crowdsignal: embeddable polls with live results that survive a busy day, and honest defences against a stuffed ballot. STACK - Node 20+ with Fastify - SQLite through better-sqlite3, WAL mode - One embeddable script under 10KB gzipped, plus a hosted page for each poll - Caddy in front THE DATA MODEL - polls: id, slug, question, kind, options_json, status, opens_at, closes_at, results_visibility, allow_multiple, allow_other, randomise_options, theme_json - responses: id, poll_id, option_ids_json, other_text, voter_hash, session_id, referrer_host, country, device, bot, created_at - surveys: id, slug, title, intro_md, thank_you_md, status, one_response_per, created_at - questions: id, survey_id, position, kind, prompt, config_json, required, logic_json - answers: id, response_id, question_id, value_text, value_num, value_json - tallies: poll_id, option_id, count, updated_at — a materialised counter kept in the same transaction as the insert, because counting a million rows on every page load is the way this falls over - Question kinds: single choice, multiple choice, rating, scale, ranking, free text, date, email VOTING ONCE, HONESTLY - Four levels, chosen per poll and stated on the results page: open to all, one per browser, one per address, one per verified email - The browser level uses localStorage plus a session cookie; the address level uses a salted HMAC of the address with a per-poll salt so hashes cannot be joined across polls - Say plainly in the interface what each level actually stops. One per address blocks the casual double vote and nothing more; anyone determined will use a phone. A tool that claims otherwise is lying to its owner - Rate limits per address and per poll, and a burst detector that flags a poll whose votes arrive too regularly to be people - Bots flagged, recorded, and excluded from the published tally — never dropped LIVE RESULTS THAT DO NOT FALL OVER - The tally is a counter row updated in the same transaction as the vote; the results endpoint reads one row per option - Results cached in memory with a short TTL and an ETag, so a poll on the front page of somewhere costs one query a second, not one per visitor - Live updates by polling that endpoint on a backoff, not by a socket per viewer - Results visibility per poll: always, after voting, after closing, or never public SURVEYS - Multiple questions with conditional logic: show this if that answer was chosen - Page breaks, progress indicator, partial responses saved and resumable by token - Required questions enforced on the server as well as in the browser - A thank-you page, optionally redirecting somewhere EMBEDS - An inline embed that resizes itself with a postMessage handshake, never an iframe of a fixed guessed height - A hosted page for sharing as a link, with Open Graph tags and a generated preview image showing the question - A static image of the current results for places that run no scripts, regenerated on a schedule - Keyboard operable, labelled for screen readers, and usable at 320px RESULTS AND EXPORT - Charts drawn as inline SVG: bar for choices, a distribution for ratings, no charting library - Cross-tabulation by any question in a survey - Export CSV and JSON, complete, in one click, including free text - Every export says how many responses were excluded as bot traffic and why OPERATIONS - .env: DATABASE_PATH, BASE_URL, HASH_SALT, SESSION_SECRET, GEOIP_DB_PATH, ALLOWED_ORIGINS - Migrations on boot, each once - Nightly backup off the machine, restore script - Health endpoint that casts and rolls back a vote WHAT MATTERS MOST The tally counter and the honest description of the vote defences. Build the transaction that increments the counter with the response, then load-test one poll with tens of thousands of votes. A poll that shows a wrong number under load has failed at the only thing it does. Give me the repository, the embed script, migrations, .env.example, a seed with three polls and one branching survey, and a README with deploy steps behind Caddy.
What you lose
- Duplicate-vote defences refined across thousands of polls
- Live result rendering that does not fall over when a poll goes viral
- Embeds that work in email, blogs and social posts
If you would rather not build
- A form and a count, which is what this is
- A GitHub Discussions poll, which is free
What it costs
read from their page 15 Aug 2026
| Plan | Billed monthly | Billed yearly | Last read |
|---|---|---|---|
| — | $15/mo | — | 15 Aug 2026 |
Their pricing page is where these came from. Seeing a different price? Tell us.
The escape hatch
open source · no votes, no paid placement
Formbricks
$0Self-hosted surveys with logic, if a poll grows into a questionnaire.
formbricks/formbricksfree · open source
LimeSurvey
$0For when the poll needs to be a serious questionnaire.
LimeSurvey/LimeSurveyfree · open source
Why this verdict
our own opinion · changed only by a person
90/100
Verdict yes at 90. A poll is a count. Being honest that it is indicative rather than secure is the right design decision.
History
tracked since 10 Aug 2026 · nothing is ever overwritten
Questions about Crowdsignal
answered from the record above
Is Crowdsignal free?
No — the plan we track is $15 a month. Individual at around $15/month billed monthly, cheaper annually.
Can you replace Crowdsignal by building your own?
YES. Replaceable in one session with an AI coding agent. Replacement score 90 out of 100, build time one session. Read what you lose before you decide.
How much does Crowdsignal cost?
$15 a month on Individual — $180 a year. Recorded 10 Aug 2026.
What do you lose by replacing Crowdsignal?
Duplicate-vote defences refined across thousands of polls; Live result rendering that does not fall over when a poll goes viral; Embeds that work in email, blogs and social posts. If any of those carry weight for you, keep paying.
Is there an open-source alternative to Crowdsignal?
Yes: Formbricks, LimeSurvey. The prompt on this page is for when you want it your way instead.
Related entries
same category first, most replaced first
Every week, something stops being worth paying for.
New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.
free forever · no tracking pixel · stored here, never passed to anyone

