OptinMonster

optinmonster.comcontributed by Samuele Ongaro

YES

Replaceable in one session with an AI coding agent.

Popups and slide-ins for collecting email addresses, with exit intent, scroll triggers and page-level targeting, plus split testing.

Promptfree, for everyone, and the only version there is
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

PlanBilled monthlyBilled yearlyLast 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

$0

Self-hosted targeted prompts with trigger rules already built.

formbricks/formbricksfree · open source

Listmonk

$0

Handles 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

Interest · last 30 dayspeak 2/day
views01230 Aug4 Sept9 Sept14 Sept19 Sept24 Sept28 Sept
— views— prompt copies none yet— votes none yet

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

All 31 in Design & website builders

Not sending yet

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

Esc