A contact form widget for any site
A hosted contact form you can drop on any page — every submission stored, emailed, and exportable. No backend to run, no plugin to install.
What a contact form widget actually is
A contact form widget is a small, embeddable form you drop onto any page so visitors can reach you — and a place for those messages to land. The widget part is the visible field set on your site; the part most people forget is everything behind it: where the submission gets stored, who gets notified, and how you spam-proof it. A plain HTML <form> tag gives you the first part and none of the second. The moment you ship one, you discover you also need a server to receive the POST, a database to keep the entries, an SMTP setup to email yourself, and a bot filter so you aren't buried in junk.
widgetful's contact form is the whole stack, hosted. You paste one script tag, and every submission is durably stored, emailed to your workspace, and exportable to CSV — with custom fields, validation, and spam protection built in. No backend to run, no CMS, no plugin to keep patched.
No plugin, no backend, any site
This is the part that trips people up when they search for a "contact form": most answers assume you're on WordPress and want a plugin. If you're not — if you're running a static site, a Next.js or Astro app, a Rails or Django project, a Shopify storefront, or a single hand-written index.html — a PHP plugin does you no good. You either roll your own form endpoint or you reach for a hosted form.
widgetful is the hosted route, and it's framework-agnostic on purpose. The embed is one tiny vanilla-JavaScript tag loaded with defer and served from the edge at cdn.widgetful.com. There's no build step, no npm package, no server route to add, and nothing PHP-specific. The exact same snippet works whether your site is a Jekyll blog on a CDN or a production Rails monolith. If your page can include a <script> tag, it can have a fully working contact form.
How it works
Create a contact form in the dashboard, define the fields you want, then paste one snippet just before the closing </body> tag on whatever page should show the form:
<script src="https://cdn.widgetful.com/w.js" data-key="pub_yourkey" defer></script>
That's the entire install. A non-developer can do it: open the page's HTML (or your site builder's "custom code" / "embed" box), paste the line, save. From that point on, when a visitor fills in the form and hits submit, the entry is ingested at the edge on Cloudflare Workers, validated against the fields you defined, written to durable storage, and emailed to your workspace. You watch the submissions arrive in your dashboard, see which page each one came from, and export everything to CSV whenever you need it. Full setup details, including how to grab your real embed key, live in the docs.
If you'd rather not click through the setup yourself, a coding agent can do it for you. Tools like Claude Code or Codex can create the account and contact form, drop the snippet into your site, and verify the install via the API before you even sign up — they read machine-readable instructions at /install.md and /llms.txt, both linked from the docs. Paste a prompt, let the agent wire it up, and check the result in your dashboard.
One nice side effect of being script-based: you can move the form. Today it's on /contact; next month you paste the same snippet into your footer or a help-center page, and submissions keep flowing into the same inbox.
Custom fields and validation
A contact form is only as useful as the fields it asks for. The defaults — name, email, message — cover "get in touch," but real forms usually need more structure. widgetful lets you define custom fields with validation, so you can shape the form to the job:
- Sales / demo requests: company name, team size, and a "what are you trying to solve" box — so the message arrives qualified instead of as a vague "interested!"
- Support intake: a required email, an order or account reference, and a description, so you have enough to act on before you reply.
- Freelance / agency inquiries: budget range, timeline, and project scope, which filters tire-kickers before they hit your inbox.
- Event or speaker submissions: name, a link, and a short pitch, all captured in one place and exportable as a CSV the whole team can sort.
Fields you mark required are validated, so missing or malformed values — a required email that isn't a real email, or a blank required field — get caught before they reach your inbox. That keeps your stored data clean and your CSV exports trustworthy, instead of half-empty rows you have to chase down later.
Spam protection without a CAPTCHA wall
Every public contact form is a magnet for bots, and the usual "solution" — a CAPTCHA — taxes your real visitors to stop the fake ones. widgetful leans on quieter defenses. Each form ships with a honeypot field: an input hidden from humans that automated scripts tend to fill in, which lets us flag and drop obvious bot submissions without making a real person prove their humanity.
On top of that, the public embed key is write-only, and security comes from an origin allowlist plus rate limiting rather than from keeping the key secret. You list the domains allowed to submit to your form, so even if someone copies your snippet, they can't pipe junk from random-spam-site.example into your inbox. Rate limiting at the edge absorbs floods before they ever reach your storage. The result is far less noise without a friction wall in front of legitimate people.
Email notifications and where submissions live
Storage and email aren't either/or — you get both. Every submission is emailed to your workspace the moment it arrives, so you can reply from your normal inbox like you would to any message. And every submission is also stored durably in your dashboard, so email isn't your only copy. That matters more than it sounds: notification emails get buried, filtered, or accidentally deleted, and then the lead is just gone. With the dashboard as the system of record, you always have the full history — including which page each submission came from — and a one-click CSV export when you want to hand the data to a spreadsheet, a CRM import, or a teammate.
Contact form widget vs. rolling your own vs. a WordPress plugin
There are three common ways to get a contact form. Here's how they compare on the things that actually cost you time later:
| widgetful | Roll your own backend | WordPress plugin | |
|---|---|---|---|
| Works without a CMS | Yes — any site or framework | Yes, but you build it | No — WordPress only |
| Server to maintain | None | Yours, forever | Your WP host + PHP |
| Storage + CSV export | Built in | You build the DB | Varies / often paid add-on |
| Email delivery | Built in | You wire up SMTP | Often unreliable from WP |
| Spam protection | Honeypot + origin allowlist | You add it yourself | Plugin-dependent |
| Setup time | One script tag | Hours to days | Install, configure, patch |
Rolling your own makes sense when you have unusual requirements and engineering time to spare — but for a contact form, you're rebuilding storage, email, validation, and spam handling that already exist. A WordPress plugin is fine if you live in WordPress, but it ties the form to that one platform, depends on your host for email deliverability (a notorious WP pain point), and adds one more thing to keep updated and secure. widgetful skips both problems: nothing to host, and nothing tied to a particular CMS.
Getting good submissions, not just more of them
A few habits make a contact form genuinely useful instead of a noise generator:
- Ask only for what you'll act on. Every extra required field lowers completion. If you don't use a phone number, don't require one.
- Use required validation on the email field. A reply-to you can't reply to is a dead lead. Marking the email field required catches typo'd and empty addresses before the submission is stored.
- Lock down your origin allowlist early. List your real domains so the form only accepts submissions from pages you control.
- Add a hidden source field per page. If you reuse the same form in your footer, a help page, and a landing page, a custom field that records where it lives lets you sort the dashboard inbox by origin and see which placement actually drives messages.
- Export periodically. Even with email notifications, a monthly CSV export gives you a clean backup and an easy way to spot trends in what people ask.
If contact isn't the only thing you want to ask visitors, the same one-tag approach covers more ground: an email signup form for your list or waitlist, or a website feedback tool when you want reactions to specific pages rather than open-ended messages. Every plan includes the full catalog, so you're not paying per widget type.
Questions people ask
Do I need a server or a database to use this?
No. widgetful hosts the ingestion, storage, and email. The only thing on your side is one <script> tag — there's no backend, no database, and nothing to deploy.
Will it work on my Next.js / Rails / static site?
Yes. The embed is a framework-agnostic script tag served from the edge, so it works the same on plain HTML, Next.js, Rails, Astro, Hugo, Shopify, WordPress, or a static site on a CDN. No CMS or plugin required.
Where do submissions actually go?
Each one is stored in your dashboard inbox, emailed to your workspace on arrival, and available as a CSV export any time. You also see which page each submission came from.
Can I add custom fields like company size or budget?
Yes. Define whatever fields the form needs and mark which are required; required fields are validated, so missing or malformed values are caught before they reach your inbox and your data stays clean.
How does it stop spam without annoying real visitors?
A hidden honeypot field traps automated submissions, an origin allowlist restricts which domains can submit to your form, and rate limiting absorbs floods at the edge — all without forcing a CAPTCHA on legitimate people.
Is the form cookieless? What about privacy?
The embed is cookieless and does no cross-site tracking, which keeps you on the friendly side of consent banners. See our privacy page for the details.
What does it cost?
You can start free — no card required — with the full catalog included, then upgrade as your volume grows. The free tier covers a real contact form and displays a small "powered by widgetful" badge; paid tiers add scale, unlimited history, and remove the badge along with adding a custom domain and webhooks. See pricing, and when you're ready you can start free.
Try it on your site
Create a widget, paste one snippet, and watch responses roll in. The free plan is genuinely free — 1,000 responses a month, no card, live in about a minute.