Popups and slide-ins for collecting email addresses, with exit intent, scroll triggers and page-level targeting, plus split testing.
Build me the email capture I actually need instead of OptinMonster: a well-aimed offer, tested, that does not make people hate the site. STACK - Node 20+ with Fastify - SQLite through better-sqlite3, WAL mode - One embeddable script under 10KB gzipped, from my own domain - Caddy in front BEFORE THE SPECIFICATION, THE THING THAT DECIDES WHETHER THIS WORKS - A popup is an interruption. It converts because it interrupts, and it costs goodwill for the same reason - So the whole design is about aiming: shown to the right person, at the right moment, once. A tool that shows everything to everybody converts worse and annoys more - Never a popup on the first few seconds of a first visit, never one that covers the content on a phone, never one whose close button is hidden or delayed, never a second one after the first is dismissed - Google penalises intrusive interstitials on mobile, which is a search ranking consequence on top of the human one - Build the frequency rules before the templates and default them conservatively THE DATA MODEL - campaigns: id, name, kind, status, content_json, theme_json, position, priority, starts_at, ends_at - variants: id, campaign_id, name, content_json, weight — for split testing - rules: id, campaign_id, kind, operator, value — page, referrer, country, device, new or returning, UTM, scroll depth, time on page, exit intent, cart value - frequency: id, campaign_id, max_per_session, days_after_dismiss, days_after_convert, global_cooldown_days - impressions: id, campaign_id, variant_id, session_hash, shown_at, dismissed_at, converted_at - conversions: id, impression_id, email, name, fields_json, created_at - subscribers: id, email, token, confirmed_at, unsubscribed_at, source_campaign_id, consent_text, consent_at, ip_hash - Every impression recorded. A conversion rate without a denominator is a marketing claim KINDS - A bar at the top or bottom that pushes the page rather than covering it — the least intrusive and often the best value - An inline block within the content, which converts well and costs nothing in goodwill - A slide-in from a corner, triggered by scroll depth - A modal, which converts best and annoys most. Offer it, with the trade written next to it in the interface TRIGGERS - Scroll depth as a percentage, time on page, a number of pages in the session, a click on a chosen element, and exit intent - Exit intent on desktop is the cursor leaving through the top of the viewport. On a phone there is no cursor, so it is a fast upward scroll or a back gesture — both are guesses, and both misfire. Say so in the interface, and default mobile exit intent to off - Trigger on a custom event my own code sends, which is how 'they added to the basket then stopped' becomes a rule TARGETING - By page pattern, referrer, country, device, new or returning visitor, UTM parameter, day and time - Rules read as sentences in the admin, with a preview of how many recent sessions would have matched - One campaign shows at a time, chosen by priority, and the admin flags colliding rules before saving THE FORM - Email, and nothing else unless there is a real reason. Every additional field costs conversions - A honeypot and a minimum time on form - Double opt-in available and off by default, with the consequence of each stated - The consent sentence stored with its timestamp, exactly as the person saw it - One-click unsubscribe that needs no login, from every email that follows - Success replaces the form in place; a redirect is optional TESTING PROPERLY - Two or more variants on one campaign, split by a hash of the session so a visitor always sees the same one - The split, the sample size and the confidence shown together, and no winner declared before the sample size set in advance. Calling a winner at forty conversions is how a tool convinces you of something untrue - One test at a time per page, or the results mean nothing MEASURING - Impressions, dismissals, conversions, conversion rate per campaign and per variant - Bots excluded from published figures and recorded with a flag - The number that matters is subscribers who stay subscribed and open something later — track it, because a popup that captures a thousand addresses which never open an email has achieved nothing PRIVACY - No cookie beyond a session-scoped identifier, no cross-site tracking, no third party - Country from a local database file - Addresses exportable and deletable by address OPERATIONS - .env: DATABASE_PATH, BASE_URL, HASH_SALT, SESSION_SECRET, SMTP_URL, ALLOWED_ORIGINS - Migrations on boot, each once - The payload endpoint answers from memory with an ETag; it is hit on every page view - Nightly backup off the machine, restore script - Health endpoint WHAT MATTERS MOST Frequency rules and honouring a dismissal. Build those first and test on a real site for a fortnight, watching bounce rate as well as conversions. The tool that converts best over a year is the one people do not resent. Give me the repository, the embed script, migrations, .env.example, a seed with a bar and a modal, and a README with deploy steps behind Caddy.
What you lose
- Exit-intent detection tuned across many sites, including on mobile where there is no cursor to track
- Templates that have been tested against real conversion data
- Split testing with results presented plainly
If you would rather not build
- A dialog element and a small script
- Any newsletter tool's own embed
- An inline form, which converts better than most popups
What it costs
as published on their pricing page
| Plan | Billed monthly | Billed yearly | Last read |
|---|---|---|---|
| — | $16/mo | — | — |
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 targeted prompts with trigger rules already built.
formbricks/formbricksfree · open source
Listmonk
$0Handles the list once the popup has collected the address.
knadh/listmonkfree · open source
Why this verdict
our own opinion · changed only by a person
84/100
Verdict yes at 84. The triggers are easy; the frequency rules and keyboard handling are what separate a popup from a complaint.
History
tracked since 10 Aug 2026 · nothing is ever overwritten
Questions about OptinMonster
answered from the record above
Is OptinMonster free?
No — the plan we track is $16 a month. Basic at around $16/month billed annually; monthly billing costs more.
Can you replace OptinMonster by building your own?
YES. Replaceable in one session with an AI coding agent. Replacement score 84 out of 100, build time one session. Read what you lose before you decide.
How much does OptinMonster cost?
$16 a month on Basic — $192 a year. Recorded 10 Aug 2026.
What do you lose by replacing OptinMonster?
Exit-intent detection tuned across many sites, including on mobile where there is no cursor to track; Templates that have been tested against real conversion data; Split testing with results presented plainly. If any of those carry weight for you, keep paying.
Is there an open-source alternative to OptinMonster?
Yes: Formbricks, Listmonk. 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

