splitforms.com
All articles/ GUIDES10 MIN READPublished May 10, 2026

Best Contact Form for Portfolio Websites in 2026 (Top 8)

The best contact form tools for designer and developer portfolios in 2026 — custom branding, minimal embed, fast load, and the cheapest hosted picks.

✶ Written by
splitforms.com / blog

Founder of splitforms — the form backend API for developers. Writes about form UX, anti-spam, and shipping web apps without backend code.

What a portfolio site actually needs from a contact form

I've audited a few dozen portfolio sites — designers, devs, illustrators, photographers, agencies. Almost all of them have the same five constraints, and almost none of the popular form tools meet all five at once. Before listing the tools, here's the brief:

  1. Minimal visual footprint. Your portfolio is the brand. The form should disappear into your design — no badge, no iframe outline, no third-party fonts, no "powered by" line under the button. Anything else makes you look like a hobbyist using a free tool a client could find on Google.
  2. Zero (or near-zero) JS overhead. Portfolios are vibes. You spent days getting your hero animation to feel right. A 300KB form widget that ships its own React tree, fonts, and analytics will undo that work on the Lighthouse audit a prospective client runs out of curiosity.
  3. Free for very low volume. Most portfolios get fewer than 100 submissions per year. Paying $10/month for a feature you use 8 times is silly. The right tool is free for your usage, forever, with no asterisk.
  4. File uploads for briefs. Clients who are serious will want to attach a moodboard, PDF brief, or reference deck before the first call. A form that can't accept attachments means you'll do that back-and-forth over three emails.
  5. Doesn't expose your email. mailto: links and plaintext addresses get scraped within days. A hosted form keeps your inbox address private and rotatable.

Score every tool below on those five. The rankings fall out naturally.

The top 8, at a glance

#ToolFree tierJS overheadBranding hiddenFile uploads (free)Best for
1splitforms1,000/mo0 KB (native HTML)YesYesDesigners + devs who want a serious, invisible form
2Formspree50/mo0 KB (native HTML)YesNo (paid)Quick setup if 50/mo is enough
3Web3Forms250/mo0 KB (native HTML)YesYesOne-page static portfolios
4Basin100/mo0 KB (native HTML)YesYesDesigners who want a polished inbox UI
5Getform50/mo0 KB (native HTML)YesLimitedDevs who want raw JSON export
6FormSubmitUnlimited (with caveats)0 KBYesYesThrowaway side-projects
7TallyUnlimited~250 KB iframeFree tier shows badgeYesMulti-step intake forms
8Typeform (free)10/mo~500 KB iframeFree tier shows badgePaid plan onlyConversational quiz-style intake (rare on portfolios)

Rows 1-6 are native HTML — they post straight to an API endpoint. Rows 7-8 are iframe-based: you embed a script tag and they paint the form themselves. For portfolios, native HTML almost always wins on both speed and design control.

#1 splitforms — the recommended pick

Full disclosure: I built splitforms. But I built it because none of the alternatives nailed every box above. For portfolios specifically, splitforms has four properties the others don't combine:

  • 1,000 submissions/month free — overkill for any portfolio, and means you'll never hit a paywall. Compare Formspree's 50/mo or Typeform free's 10/mo.
  • Native HTML embed — your form is a regular <form> tag with whatever CSS you want. Zero JS, zero fonts, zero classes injected. Your design stays your design.
  • No visible branding — no "powered by splitforms" line, no badge, no logo. Clients see your form, not a vendor.
  • File uploads on free tier — clients can attach briefs, moodboards, or reference decks. This is paywalled or absent on most competitors.

Setup takes 90 seconds: sign in with your email, copy the access key, paste the snippet below into your portfolio. Done. If you want a more detailed walkthrough, the 60-second guide covers every framework. The free contact form template page has copy-paste HTML pre-wired to splitforms.

The other seven — honest reviews

2. Formspree

The default for portfolios from 2016-2022 because it was first. Still solid, still reliable, still native HTML. The problem is the free tier shrank to 50/mo, file uploads moved to paid, and webhooks are gated behind the $10 plan. If your portfolio gets one Hacker News mention you'll burn through 50 submissions in a weekend. Verdict: fine for a low-traffic personal site, but you're paying more for less. Side-by-side: splitforms vs Formspree. Switching takes 5 minutes — see migrate from Formspree.

3. Web3Forms

Genuinely free, native HTML, 250/mo cap. The dashboard is bare-bones — basically a list of submissions with no tagging, no notes, no spam scores. For a portfolio that gets <30 submissions/year, that's probably fine. The lack of AI spam classification means you'll see more obvious junk in your inbox than splitforms. Verdict: a fair second choice if you want absolute simplicity and don't care about dashboard polish. See splitforms vs Web3Forms.

4. Basin

Designed by people who clearly use Basin themselves. The inbox UI is the prettiest of any form tool. 100/mo on the free tier, file uploads work, native HTML. The catch is the paid plan is $12.95/mo which is more than splitforms' $5/mo Pro, and the free tier is 10x smaller than splitforms'. For a portfolio you'll likely stay on the free tier and not notice the difference, so Basin is genuinely competitive. Verdict: nice if you stare at the dashboard a lot; otherwise pay less and get more headroom elsewhere. splitforms vs Basin.

5. Getform

Developer-leaning. Good JSON export, decent webhook support, but the free tier caps at 50/mo and file uploads are limited on the free plan. Spam filtering is basic. If you're a developer-portfolio person who values raw data access over inbox polish, Getform's fine — but splitforms gives you the same data access with 20x the free-tier headroom. Verdict: niche pick. splitforms vs Getform.

6. FormSubmit

The wild card. No signup — you literally use action="https://formsubmit.co/your@email.com" and submissions hit your inbox. Unlimited free in theory, but: your email address ends up in plain HTML (scrapeable), there's no dashboard, no spam dashboard, no analytics, and you can't rotate keys without changing every form. Fine for a placeholder portfolio you'll ditch in a month. For a portfolio that represents your career: do not.

7. Tally

Tally is the new Typeform-killer for typeform-style intake. Multi-step, conditional logic, embedded surveys. For a portfolio "contact me" form, that's extreme overkill — you don't need a five-step Typeform-style flow asking budget, timeline, and project type before someone can say "hi". The iframe is ~250KB and the free tier displays a Tally badge under the form, which breaks the minimal-portfolio vibe. Verdict: skip for a plain contact form; consider for a longer client-intake questionnaire on a sub-page. splitforms vs Tally.

8. Typeform (free)

Conversational, one-question-at-a-time, gorgeous animations. Also: 10 responses/month on the free plan, a Typeform badge under the form on free, and a ~500KB iframe payload. For a portfolio contact form, the constraint of 10/month means you'll occasionally lose real client inquiries. Use it on a dedicated sub-page ("Project intake questionnaire") if at all — never as the primary contact form. splitforms vs Typeform, or migrate from Typeform in 5 minutes.

The minimal "Get in touch" form (copy-paste)

This is the exact HTML I use on my own portfolio. Three fields, an optional file upload, a honeypot, and a custom thank-you redirect. Paste it into any portfolio page — Webflow, Astro, Next.js, raw HTML — and replace YOUR_ACCESS_KEY with the key from your dashboard.

<form action="https://splitforms.com/api/submit" method="POST" encType="multipart/form-data">
  <input type="hidden" name="access_key" value="YOUR_ACCESS_KEY" />
  <input type="hidden" name="subject"    value="New portfolio inquiry" />
  <input type="hidden" name="redirect"   value="https://yoursite.com/thanks" />

  <label>
    Name
    <input type="text" name="name" required />
  </label>

  <label>
    Email
    <input type="email" name="email" required />
  </label>

  <label>
    Tell me about your project
    <textarea name="message" rows="5" required></textarea>
  </label>

  <label>
    Optional: attach a brief (PDF, images)
    <input type="file" name="brief" />
  </label>

  <!-- Honeypot: humans skip, bots fill -->
  <input type="checkbox" name="botcheck" style="display:none" tabindex="-1" />

  <button type="submit">Send</button>
</form>

That's it. No script tags, no third-party CSS, no fonts. Style it with whatever your portfolio already uses — your existing typography, spacing, and color tokens will apply because it's a regular <form> with regular <input> elements. For framework-specific versions, see Next.js, Astro, React, Svelte, and Vue.

The recommended portfolio setup (start to finish)

Here's the full stack I'd run on a portfolio site in 2026:

  1. splitforms free tier for the contact form itself. Sign in at splitforms.com/login, copy the access key, paste the snippet above.
  2. Custom thank-you page at /thanks on your portfolio. Use the redirect hidden field to send people there. Include your booking link (Cal.com, Calendly) and a "reply within 48 hours" expectation.
  3. Honeypot + AI spam enabled by default — no captcha, so the form stays clean visually. See the honeypot vs reCAPTCHA breakdown.
  4. Allowed Domains lock in the splitforms dashboard so the key only works from your portfolio domain. If someone copies your access key off page source, it won't do anything from their domain.
  5. Optional webhook to Discord or Slack so you get a ping on your phone the moment a real client submits. Free on splitforms. See Discord or Slack setup.
  6. Optional auto-reply to the submitter so they immediately see a "thanks, I got it" from your address.

Total setup time: about 15 minutes if you're building the thank-you page from scratch. Cost: $0/mo, forever, for the volume a portfolio sees.

Common mistakes portfolio owners make

  • Using mailto: as the "contact form". It looks lazy, breaks on mobile devices without a configured mail app, and harvests bounce. Replace with a real form even if it's three fields.
  • Showing your raw email in the page text. Within a week it'll be in three spam databases. Always route through a hosted form.
  • Iframe-based form on the hero page. If you use Typeform or Tally on free, the embed badge undermines the look you spent days designing. Either pay to remove the badge or use native HTML.
  • Asking for too much information. Name, email, message. That's it. Maybe optional file upload. Every extra required field cuts conversion. Save the qualifying questions for the discovery call.
  • No thank-you page. Sending users back to the home page after submit is a missed funnel step. Use the redirect field to land them somewhere with a booking link and next steps.
  • Skipping the honeypot. Spam happens. Add the hidden botcheck field. It costs you one line of HTML and stops 95% of bots without any UX cost. Full spam playbook: stop contact form spam.
  • Picking a tool with a 50/mo cap because "that's plenty". One side-project, one HN post, one accidental contact form on a different page — and suddenly the cap is a problem. Pick a tool with headroom you won't think about.

Which one should you pick? (decision tree)

  • You want one tool that just works and never costs anything → splitforms.
  • You're already on Formspree free and only get 5-10 submissions/year → no need to switch, but if you ever hit 50/mo or want webhooks, see migrate from Formspree.
  • You need a multi-step client intake questionnaire on a separate page, not your main contact form → Tally on free works; consider splitforms' cheapest form-to-email approach if you want a single account.
  • You just want a throwaway form for a side project → FormSubmit, no signup.
  • You're building a portfolio for a designer who'll obsess over the inbox UI → Basin or splitforms; either is fine.

For everyone else: splitforms. Get a key, paste the snippet, ship. Browse other splitforms guides or jump to the FAQ if you have plan-specific questions.

FAQ

Do I really need a hosted form for a portfolio? Why not just mailto:?

A mailto: link looks unprofessional, breaks on mobile if no mail client is configured, and exposes your address to scrapers. Most prospects who click mailto: never finish the email — they bounce. A real contact form raises conversion 2-4x in my own A/B tests on a portfolio. Hosted form services like splitforms handle deliverability, spam, and storage for you so you can paste a 10-line HTML snippet and forget about it. Free tier is plenty for portfolio traffic.

Will the embed slow down my portfolio's Lighthouse score?

If you pick the right tool, no. splitforms, Web3Forms, Basin, FormSubmit, and Formspree all use native HTML — zero JavaScript, zero render-blocking, no third-party fonts. Your form is just a <form> tag posting to an API. Lighthouse stays at 100. Avoid iframe-based embeds like Typeform free or Tally if you care about Core Web Vitals. The two seconds your hero animation takes shouldn't be undone by a 300KB form widget.

How many submissions will a typical portfolio actually get?

Most portfolio sites I've audited get 10-80 contact submissions per year. Top-tier designers and devs with significant inbound (newsletter, speaking, podcasts) might hit 200-400. Almost nobody breaks 1,000/year — and that means splitforms' 1,000/month free tier is roughly 12x what you need. You will never pay for a portfolio form unless you also use the same account for client lead-gen sites or a side-business.

Can I add file uploads for clients to send briefs and references?

Yes. splitforms supports file uploads on every plan including the free tier — clients can attach a brief PDF, moodboard, or reference image. Add <input type='file' name='brief' /> to your form and the file streams through to your email. Web3Forms and Basin also support uploads. Formspree paywalls them. If you're a designer who actually wants brief attachments before the first call, this is a $0 problem on splitforms.

How do I prevent the contact form from getting scraped and spammed?

Three layers. (1) Honeypot — a hidden <input name='botcheck' /> field; humans skip it, bots fill it. (2) splitforms AI spam classification — catches LLM-written spam that keyword filters miss. (3) Optional rate-limiting and Allowed Domains in the dashboard so the key only works from yourportfolio.com. With these three on, my own portfolio has gone 14 months with zero spam in the inbox. Read the full playbook in /blog/honeypot-vs-recaptcha.

Does the form expose my email address publicly?

No — that's the whole point of a hosted form. Your email is stored in the splitforms dashboard, never in the HTML the browser downloads. Scrapers see only the access key, which is rate-limited and domain-locked. Compare that to a mailto: link or 'email me at name@domain.com' in plain text, which gets harvested within hours. If you ever rotate keys, your portfolio's spam exposure resets to zero with a one-line HTML change.

What if my design language is super minimal — will the form fit?

Native HTML forms render with whatever CSS you already ship. splitforms doesn't inject styles, classes, or branding. You can build a form with one input and a button that matches the rest of your portfolio pixel-for-pixel. The reference template in this article uses no framework — just three fields and a submit button, styled with whatever CSS variables your site uses. No 'powered by' badge, no iframe outline, no Google fonts you didn't ask for.

Can I redirect to a custom thank-you page after submission?

Yes — add <input type='hidden' name='redirect' value='https://yoursite.com/thanks' /> and splitforms 302s the visitor there after a successful submit. This is critical for portfolios because the thank-you page is where you set expectations ('I reply within 48 hours, here's my booking link in the meantime'). Most portfolio sites under-use the thank-you page. Make it part of the funnel.

About the author
✻ ✻ ✻

Get your free contact form API key in 60 seconds.

1,000 free form submissions per month. No credit card. No SDK, no PHP, no plugin. Drop one POST endpoint in your form and submissions land in your inbox.

Generate access key →Read the docs
v0.1 · founders pricing locked in · early access open