Signup forms
One line of HTML, and it never goes stale
Build a signup form here, paste one script tag on your site, and edit the form as often as you like — the code you pasted carries an id and nothing else, so it never needs touching again.
The problem
Most signup forms put the form's markup in the snippet you copy. Change a field, a colour or a message and the copy on your website is out of date until somebody goes back and re-pastes it — which is the most common reason an embedded form stops matching what you built.
The whole integration
The tag names a form. Everything else — the fields, the styling, the messages, the anti-spam settings — lives here and is fetched when the page loads. Edit anything and every page it is embedded on picks it up next time somebody visits.
<script src="https://emailbump.com/f.js" data-form="frm_8f2c9a1b3d" async></script>Eight of them already built
A new project doesn’t open on an empty page. There are eight working forms to start from — a newsletter box, an inline bar, a welcome popup, a popup with an image, a two-step popup, a sticky bar, lead capture and a waitlist — and picking one gives you a real form, not a template you then have to fill in.
Two-step is the one worth knowing about: it asks for the decision first and the address second. A single button, then the email. A small first ask converts better than a big one, and somebody who has already said yes finishes far more often than somebody handed a form cold.
It can’t fight with your CSS
The form renders inside a shadow root, so your site’s stylesheet can’t reach into it and its styles can’t leak out. That is the isolation an iframe gives you, without an iframe’s fixed height — and it means several forms can share a page, each with its own look.
Six ways to put it somewhere
The same form renders as an inline block, a popup, a slide-in or a sticky bar; as an iframe where script tags are stripped; as plain HTML that works with JavaScript off; as a React or Vue component; and as a hosted page you can link to or print a QR code of.
- Script tag — the default, and the one to prefer
- Popup, slide-in or sticky bar with delay, scroll-depth or exit-intent triggers
- iframe that reports its own height
- Plain HTML for no-JavaScript pages
- React and Vue components, no package to install
- Hosted page at a link you choose
Shown where it should be, to whom it should be
Rules decide which pages a form appears on — contains, exactly, starts with, ends with — with exclusions checked last, so “everywhere except checkout” is one rule rather than a list of the pages that are left.
Then who: everyone, first-time visitors, or people who have been before. And how often: until they subscribe, once ever, or every visit. A popup also picks its moment — after a delay, past a scroll depth, or when the pointer heads for the browser chrome.
Three numbers, and the gaps between them
A form counts how often it was shown, how many people filled it in, and how many became subscribers. Shown is counted when the form actually appears rather than when the page loaded, so a popup whose trigger never fires isn’t quietly inflating the denominator.
Submissions against shown is what a popup’s placement and copy are judged on. Contacts against submissions is your confirmation rate — and a widening gap there almost always means the confirmation email stopped landing, not that people changed their minds.
Consent you can actually evidence
When a form has a consent checkbox, the exact wording shown at the time is stored with the submission — along with the timestamp, the IP address and the page it was on — and repeated back in the confirmation email.
Wording changes over time. “What did this person agree to?” is the question you need answered when a complaint arrives, and it is answered without anyone having to set anything up.
Built to be pointed at by strangers
A signup form is a public endpoint that can send email, so every submission goes through a honeypot, a timing check, a signed token proving the form was really rendered, per-network rate limits, and Cloudflare Turnstile — which needs no puzzle-solving and which most visitors never see.
Disposable-address blocking is on by default and included on every plan, free ones too. And if the same address is submitted repeatedly, we don’t send it a second confirmation — that stops your form being used to flood somebody else’s inbox.
Rebrand once, not once per form
Forms inherit colours, fonts and shapes from a theme, and store only what they override. Change the theme and every form on it restyles, live, with nothing to re-embed. A footer form that just needs to be narrower keeps inheriting everything else.
What this looks like for you
The events worth sending depend on what you sell. Three shapes of business, the events each one tracks, and the segments those events make possible.
Most SaaS signup forms are asking for a trial, a demo or a changelog subscription — and the useful part is knowing which page someone was reading when they asked.
Forms worth having
Changelog subscribeEmail only, in the docs footerLowest-friction ask on the siteDemo requestEmail, name, company sizeRoutes straight to a flowWaitlistEmail plus a hidden feature fieldOne form, many featuresPricing exit-intentPopup on the pricing page onlyCatches the ones about to leaveWhat it gives you
A hidden field captures utm_source and the page URL
Attribution on every signup without wiring anything up
The form-submitted trigger fires on confirmation, not on submit
Nobody gets onboarded who never confirmed they wanted it
Both pages embed the same form id
One edit updates both
What you can build with it
- A form you can edit without touching your website again
- Eight working forms to start from, including a two-step popup
- Rules for which pages it shows on, and who sees it
- Double opt-in that sends one email, however many lists it feeds
- Consent recorded word-for-word, automatically
- Spam kept out without making real people solve puzzles
Read the docs
Related
Try it on your own data
Free while you're under 5,000 contacts, and every feature is on every plan.
Start free