A new address becomes a lead
With the owner, source and tags the form was configured with, in the queue, on both the web app and the phone.
Build the form in Settings, paste one line into your website, and what people fill in arrives here with its owner, source and tags already set. Nobody retypes anything.
Unlimited forms and unlimited submissions. MIT licensed, self-host it anywhere.
You choose the questions and which lead field each one writes into. The CRM writes the snippet, with the right absolute address already in it.
The interesting case is the second submission from the same person, which is where a form that only ever inserts starts making a mess of your list.
With the owner, source and tags the form was configured with, in the queue, on both the web app and the phone.
Matched on email regardless of capitalisation. It fills in what was blank and never overwrites what was already there, so nobody who knows your prospect’s address can rewrite that record through your own form.
The message field lands on the lead’s timeline. The first one is not replaced by the second.
Once per accepted submission. Rejected ones tell nobody, because an inbox full of blocked bots is an inbox somebody stops reading.
The submission log holds the rejected ones too. Without them there is no spam review, and the conversion rate silently counts only the ones that worked.
Any custom field you have defined on leads can be a question on the form, validated by the same rules the rest of the app uses.
It has to. The whole point is that a stranger can fill it in without an account. So the controls are on by default rather than being a setting you find out about afterwards.
A field no human sees and no human fills. A submission that fills it is recorded as spam, writes no lead, and is told the same thing a real one is told. A bot that can tell it was caught comes back different.
One per visitor per form, one for the whole form across everybody. The second is the one that matters: the header a per-visitor limit counts on can be forged, and rotating it does nothing to a per-form cap.
Throwaway inbox domains are rejected before a lead is written. On by default, and switchable per form.
Optional, off by default, configured per form. It fails closed: a timeout or an unreachable Cloudflare refuses the submission rather than waving it through, because otherwise an attacker’s first move is to make Cloudflare unreachable. Your secret is write-only and never comes back out of the API.
List the origins allowed to use the form and browsers enforce it, for both framing and posting. Worth knowing what that is and is not: it stops another website from mounting your form, and it is not a defence against a script, because a script sets those headers itself. The rate limits and the captcha are what apply there.
A form can only write the fields you put on it, and only into the fifteen lead columns a form is allowed to touch. Owner, pipeline stage, probability and deal value are not among them, whatever a submission claims.
This is the whole list. There is no A/B testing, no funnel builder and no attribution model, so this page does not claim them.
How many times the form rendered on your site, per day.
Accepted ones, including the returning visitors who merged into a lead you already had.
What the honeypot, the captcha and the address rules refused, per day.
Submissions over views across the trailing thirty days.
A published form that has heard nothing in a month is flagged in Settings. Usually the snippet came off the page and nothing else would tell you.
Every post to the form, what it contained, and whether it became a lead.
The source is public. Read the spam controls before you trust a word on this page.
No. You build the form in Settings, choose which lead field each question writes into, and copy the snippet it gives you into your site. If your site is WordPress, Webflow, Squarespace, plain HTML or anything else that lets you paste an embed, that is the whole job. The API is there if you would rather post the form yourself.
A hidden honeypot field, a per-visitor rate limit, a per-form rate limit that header rotation cannot evade, and rejection of disposable email domains. All four are on by default and none of them can be switched off by accident. Cloudflare Turnstile is available per form if a determined bot finds you, and it fails closed rather than open.
You get one lead, not two. The second submission fills in anything that was blank and leaves everything already recorded alone, and the message goes onto the lead as a comment. That rule is deliberate rather than convenient: anyone who knows an address can post your public form, so allowing an overwrite would let a stranger rewrite that person’s record.
Yes, and you can build a different form per site or per campaign. Each one has its own fields, owner, tags and analytics, so the numbers tell you which page is working. Restrict each form to the origins you expect it on.
Into your own database. This is the same self-hosted CRM as everything else on this site: the form posts to your backend, not to ours, and no third party sits in the middle. If you turn on Turnstile, that one check is the only outbound call, and it goes to Cloudflare with a secret you supply.
Not from us. There is no per-form fee, no submission quota and no seat cap, because there is no billing. The per-form rate limit is a spam control with a default you can raise for a busy page, not a plan boundary.
No per-form fee, no submission quota, no trial clock. Host it yourself, or let MicroPyramid run it.