What a Shopify store actually needs from a form
Most Shopify form roundups list features in the abstract. Let's be concrete. If you run a real store — not a hobby project — your contact form has to do five things the built-in template can't:
- Auto-inject product context. When a shopper emails from a PDP (product detail page), the notification should say exactly which product they're asking about, with a clickable URL. Shopify's default form doesn't do this — you get a generic message with no product reference.
- Order-aware customer service intake. A support form should ask for the order number, issue type (defective / wrong item / shipping delay / refund / other), and an optional photo upload. Routing this to your help desk beats a wall of free-text messages.
- Wholesale / B2B inquiry separation. Wholesale leads should go to sales@, not support@. That means two forms with two destinations — easy with separate access keys, hard with the native template.
- Newsletter sync to Klaviyo or Mailchimp. If your email tool is Klaviyo (it usually is), every form submission with an opt-in needs to land in a Klaviyo list within seconds — not via a nightly CSV.
- No app subscription bloat. Most stores already pay for 4–6 apps. Adding another $10/month form app for what is fundamentally a `<form>` POST is silly. The right answer is paste-in HTML that posts to a hosted endpoint.
Score the 7 tools below against those five needs. splitforms is the only one that hits all five on the free tier.
The 7 best contact form tools for Shopify (at a glance)
| Tool | Shopify app needed? | Free tier | Webhooks (Klaviyo) | Product context | Cheapest paid |
|---|---|---|---|---|---|
| splitforms | No (paste in Liquid) | 1,000/mo | Free | Via Liquid hidden inputs | $5/mo |
| Shopify Forms (native) | Built-in | Unlimited | No (Shopify Flow only) | Manual | Free with Shopify plan |
| POWR Form Builder | Yes | 25/mo | Paid only ($14.99) | Plugin field | $5.49/mo |
| Globo Form Builder | Yes | 1 form, 50 subs | Paid only | Plugin field | $9.90/mo |
| Formidable Forms | Yes | Limited | Paid | Plugin field | $9.99/mo |
| Hulk Form Builder | Yes | Generous | Paid tier only | Plugin field | $9.90/mo |
| JotForm (Shopify integ.) | Embed code | 5 forms, 100 subs | $34/mo+ tier | Manual | $34/mo |
splitforms is the only one that doesn't require either a Shopify app or a paywall to do the basics. Get a free access key and skip ahead to the template at the bottom of this post.
1. splitforms — best for Shopify stores in 2026
splitforms is a form-to-email service that gives you a single endpoint to POST to. You paste a normal HTML form into a Liquid section, add a hidden access_key input, and submissions land in your inbox and your splitforms dashboard. No Shopify app install — which means no extra JS on every page and no monthly app subscription.
Pricing: 1,000 submissions/month free, $5/month Pro for 5,000, $59 for 4 years if you want to lock in the cheapest possible rate.
What's good for Shopify: Webhooks are free on every tier — so you can fire a Klaviyo Track event on every newsletter signup without paying for an app. AI spam classification ships on the free tier (most form tools paywall this or use keyword filters). File uploads are included free, so wholesale inquiries with attached resale certificates work out of the box. Custom SMTP means deliverability is your own Gmail/SES — not a shared sender that can land in spam.
What's missing: No drag-and-drop visual builder. You write HTML. If you don't know basic HTML, the other tools have an easier first 5 minutes — but you'll pay for it forever in app subscriptions. See the no-app Shopify tutorial for the step-by-step.
Verdict: Best choice for any Shopify store that already pays for a stack of apps and doesn't need another one. Especially good if you use Klaviyo or care about page speed.
2. Shopify Forms (native) — fine for hobby stores only
Shopify Forms is the built-in contact form template that ships with every Shopify theme. The route is /pages/contact and the Liquid tag is {% form 'contact' %}. It posts to Shopify's own form handler and sends an email to the address in your store's general settings.
Pricing: Included with every Shopify plan, unlimited submissions.
What's good: Zero setup, no third-party service to trust, unlimited volume. Works out of the box on every theme.
What's missing: No webhooks (you can rig something via Shopify Flow on Shopify+ but it's clunky), no file uploads, no AI spam filter, no per-submission routing, no product context auto-injection, no built-in Klaviyo sync. The notification email is plain and ugly. If you customize fields beyond the defaults, you have to hand-edit Liquid and the form handler silently drops fields it doesn't recognize.
Verdict: Fine for a brand-new store doing < 5 inquiries/week with no integration needs. The moment you need anything beyond "email me when someone submits", you've outgrown it.
3. POWR Form Builder
POWR is one of the older Shopify form apps, in the app store since the early Shopify days. Drag-and-drop builder, a library of templates, integrates with Mailchimp and Zapier on paid tiers.
Pricing: Free tier limited to 25 submissions/month (very low for a real store). Paid plans start at $5.49/month and go up to $89.99/month for advanced features.
What's good: Easy visual builder, lots of templates, well-known brand in the Shopify ecosystem.
What's missing: 25/month free cap is restrictive — splitforms gives you 1,000 free. The app injects POWR's JS on every page it's used, which adds to your bundle. Webhooks and Zapier are paid only. Branded with a "Powered by POWR" label unless you upgrade.
Verdict: Works if you want a visual builder and have a small store. Cost adds up if you also use POWR for popups or galleries — they bill per feature.
4. Globo Form Builder
Globo is a Shopify-specific form app with strong product-form features (it can auto-inject the current product into a form submission, which is its main selling point).
Pricing: Free tier covers 1 form and 50 submissions. Premium is $9.90/month for unlimited.
What's good: Native product field — drop the form on a PDP and it auto-fills the product. File uploads on free tier. Good Shopify-specific UX.
What's missing: Single-form limit on free tier means you can't separate wholesale from support without paying. No AI spam (uses captcha which slows mobile). Webhooks require the paid plan.
Verdict: Reasonable choice if you want a Shopify-native app and don't mind the $9.90/month. splitforms beats it on free-tier headroom (1,000 vs 50 submissions) and on webhooks.
5. Formidable Forms
Formidable Forms is a Shopify app that focuses on conditional logic and multi-step forms. Good for stores doing custom-order quotes or product configurators.
Pricing: Free tier is functional but limited. Paid plans from $9.99/month.
What's good: Conditional logic on the free tier (most apps paywall this). Multi-step forms are clean. Decent template library.
What's missing: Webhook integrations on paid only. Email notification is branded unless you upgrade. The conditional-logic feature is overkill for a basic contact form — you're paying for power you don't need.
Verdict: Pick this if you genuinely need a multi-step configurator. For a regular contact / support / wholesale form it's overspec'd.
6. Hulk Form Builder
Hulk is a generous-free-tier form builder with a wide template library. It's a common "safe pick" in Shopify communities.
Pricing: Free tier with unlimited forms and a reasonable submission cap. Paid plans from $9.90/month.
What's good: Unlimited forms on free tier, large template library, conditional logic.
What's missing: Notification UX is dated. Webhook integrations are paid. The app injects scripts on every theme page, which on a Dawn theme can shave 50–100ms off LCP. Email styling is template-locked.
Verdict: Functional and free, but adds JS overhead. If you care about page speed, paste-in HTML via splitforms is faster.
7. JotForm Shopify integration
JotForm is a general-purpose form builder that has a Shopify integration via embed code. Not a true Shopify app — you embed a JotForm-hosted form on your store.
Pricing: Free tier capped at 5 forms and 100 submissions/month. Bronze plan is $34/month for 1,000 submissions — same volume splitforms gives free.
What's good: Mature visual builder, lots of integrations, HIPAA option on enterprise.
What's missing: Forms are iframe-embedded which feels off-brand on a polished Shopify store. JotForm branding on free tier. Pricing is the highest of the seven — $34/month is steep for what splitforms gives at $5. See splitforms vs JotForm for the full breakdown.
Verdict: Pick it if you already use JotForm elsewhere in your business. Otherwise the pricing is hard to justify for a Shopify store.
The recommended setup for a real Shopify store
Here's what we'd ship if we were launching a new Shopify store tomorrow. Three forms, one tool, one stack of integrations:
- Product inquiry form on every PDP — single splitforms key, hidden inputs for product title + URL, sends to
support@yourstore.com. - Customer service form at
/pages/contact— separate splitforms key, asks for order #, issue type, optional photo upload, routes to your help desk inbox. - Wholesale form at
/pages/wholesale— third splitforms key, longer fields (company, monthly volume, resale cert upload), routes tosales@yourstore.com.
Add one webhook on the customer service form pointing at your help desk's inbound API (Front, Help Scout, Zendesk all support this). Add another webhook on the wholesale form pointing at a Slack channel so sales sees leads in real time. Add a third webhook on any of these that has a newsletter opt-in checkbox, pointing at Klaviyo's Track API.
Total cost: $0/month on splitforms free if you're under 1,000 combined submissions; $5/month if you scale past that. Compare to the typical Shopify app stack (form app $10 + popup app $10 + chat app $15) and you're saving real money.
The full walkthrough is in add a contact form to Shopify without an app.
Copy-paste: Shopify product inquiry form template
Drop this into a new Liquid section (Online Store → Themes → Edit code → Sections → Add a new section). Reference the section from your product template with {% section 'product-inquiry-form' %}. Replace YOUR_ACCESS_KEY with the key from your splitforms dashboard.
{% comment %} sections/product-inquiry-form.liquid {% endcomment %}
<div class="product-inquiry">
<h3>Ask a question about this product</h3>
<form action="https://splitforms.com/api/submit" method="POST">
<input type="hidden" name="access_key" value="YOUR_ACCESS_KEY" />
{% comment %} Auto-injected product context {% endcomment %}
<input type="hidden" name="product" value="{{ product.title }}" />
<input type="hidden" name="product_url" value="{{ shop.url }}{{ product.url }}" />
<input type="hidden" name="variant_id" value="{{ product.selected_or_first_available_variant.id }}" />
<input type="hidden" name="price" value="{{ product.price | money }}" />
<input type="hidden" name="subject" value="Inquiry: {{ product.title }}" />
<label>
Your name
<input type="text" name="name" required />
</label>
<label>
Email
<input type="email" name="email" required />
</label>
<label>
Question
<textarea name="message" rows="4" required></textarea>
</label>
{% comment %} Optional newsletter opt-in (fires webhook to Klaviyo) {% endcomment %}
<label>
<input type="checkbox" name="newsletter_optin" value="yes" />
Email me when this product is back in stock or on sale
</label>
{% comment %} Honeypot — hidden from real users, catches bots {% endcomment %}
<input type="checkbox" name="botcheck" style="display:none" tabindex="-1" />
<button type="submit">Send question</button>
</form>
</div>
{% schema %}
{
"name": "Product inquiry form",
"presets": [{ "name": "Product inquiry form" }]
}
{% endschema %}When a shopper hits send, the notification email shows: the product title, a clickable product URL, the variant ID, the current price, their name/email, their question, and whether they opted into newsletter. That last field — newsletter_optin — is what your Klaviyo webhook reads to decide whether to add them to your list. Framework users wanting the same shape on a headless storefront can use the Next.js form backend integration.
Copy-paste: Shopify customer service intake form
For your /pages/contact template. Uses a different access key so submissions route to your support inbox separately from product inquiries.
<form action="https://splitforms.com/api/submit" method="POST" enctype="multipart/form-data">
<input type="hidden" name="access_key" value="YOUR_SUPPORT_ACCESS_KEY" />
<input type="hidden" name="subject" value="Support request" />
<label>Name <input type="text" name="name" required /></label>
<label>Email <input type="email" name="email" required /></label>
<label>Order number (optional)
<input type="text" name="order_number" placeholder="#1234" />
</label>
<label>Issue type
<select name="issue_type" required>
<option value="">Select one</option>
<option>Defective product</option>
<option>Wrong item shipped</option>
<option>Shipping delay</option>
<option>Refund request</option>
<option>Sizing / fit</option>
<option>Other</option>
</select>
</label>
<label>Describe the issue
<textarea name="message" rows="5" required></textarea>
</label>
<label>Photo (optional, helps us resolve faster)
<input type="file" name="attachment" accept="image/*" />
</label>
<input type="checkbox" name="botcheck" style="display:none" tabindex="-1" />
<button type="submit">Submit request</button>
</form>The enctype="multipart/form-data" is required for file uploads to work. After Storage is connected, splitforms accepts up to 5 files per submission at 10 MB each. If you use a help desk, point a webhook at its inbound API and tickets get created automatically.
Common Shopify form mistakes to avoid
- Using one app for forms, popups, chat, and reviews. "Bundle" apps charge per feature and the JS bundle gets huge. Use a paste-in form (splitforms) and pick best-in-class for the other features.
- Letting Shopify handle high-volume support intake. Shopify's notification email goes to your store's contact email — usually a personal Gmail. Once volume picks up, it's a mess. Route via webhook to a real help desk from day one.
- Skipping the honeypot. Even with AI spam classification, a hidden
botcheckinput catches another 5–10% of automated submissions for free. Add it to every form. - Adding reCAPTCHA on mobile. Google's reCAPTCHA on a Shopify store loads 60–120KB of JS and hurts Lighthouse. AI spam plus honeypot is enough — see honeypot vs reCAPTCHA.
- Not separating wholesale from support. Wholesale inquiries need different fields (resale certificate upload, monthly volume) and a different reply path (sales, not support). Two forms, two access keys.
- Forgetting the
subjectfield. Without a subject, every submission email has the same generic title. Set<input type="hidden" name="subject" value="Inquiry: {{ product.title }}" />and your inbox stays sortable.
Next steps
- Get started: create a free splitforms account (1,000 submissions/month, no credit card).
- Step-by-step Shopify tutorial: add a contact form to Shopify without an app.
- Need a starter HTML form? Grab a free contact form template pre-wired to splitforms.
- Migrating from a different tool: Migrate from Formspree, or browse all blog posts.
- API reference and webhook docs: /docs, /api-reference.
- Plan, pricing, and security questions: /faq.
FAQ
Does Shopify have a built-in contact form?
Yes. Shopify ships a default Contact page template at /pages/contact that posts to Shopify's built-in form handler. It works, but it's limited: no file uploads, no webhooks, basic spam protection only, no auto-injection of product context, and the notification email is branded with Shopify headers. For a real store you'll outgrow it fast — especially the moment you need wholesale inquiries, order-specific intake, or Klaviyo sync.
Do I need a Shopify app to add a custom form?
No, and you usually shouldn't. Most form apps charge $5–$15/month per store and inject extra JavaScript on every page that hurts Core Web Vitals. With splitforms you paste a regular HTML form into a Liquid section — no app install, no extra JS bundle, no theme conflicts. The form posts directly to splitforms.com/api/submit and shows up in your dashboard plus your inbox.
How do I capture the product the customer is asking about?
Use a hidden input populated from Liquid: `<input type="hidden" name="product" value="{{ product.title }}" />` and another for the URL: `<input type="hidden" name="product_url" value="{{ shop.url }}{{ product.url }}" />`. When the customer hits send, the notification email lists exactly which product they're inquiring about, with a clickable link. This is the single biggest win over Shopify's built-in form.
Can I sync newsletter signups to Klaviyo or Mailchimp?
Yes. splitforms has free webhooks (most competitors paywall them) so you can fire a webhook on every submission. Point it at Klaviyo's Track API or Mailchimp's Lists API, map the email field, and you're done. We have a worked example in /docs. No Zapier required — but Zapier works too if you'd rather not write the receiver.
Will adding a custom form slow down my Shopify store?
Not if you embed properly. The splitforms approach adds zero JavaScript and one extra DNS lookup only when the form is submitted. App-based form builders inject 50–150KB of JS on every page including product, collection, and home — which Lighthouse penalizes. A plain HTML form in a Liquid section is the fastest possible implementation. We measured a 0.3s LCP improvement on a typical Dawn theme after removing an app form builder.
What about wholesale and B2B inquiry forms?
Add a separate /pages/wholesale template with a longer form: company name, monthly volume, business address, resale certificate upload, etc. With splitforms you can route wholesale submissions to a different email (sales@) than support submissions (support@) by using two separate access keys — one per form. File uploads are included on the free tier.
How do I protect the form from spam without breaking checkout flow?
splitforms ships AI spam classification on the free tier — it scores each submission and silently drops the obvious bots without touching your customers. Add a hidden honeypot field (`botcheck`) for the rest. Don't use reCAPTCHA on a Shopify store — it adds a Google bundle that fights with your theme's lazy-loading and annoys mobile shoppers. See our writeup on /blog/honeypot-vs-recaptcha for why.
Can splitforms handle high-volume support intake for a busy store?
Yes. The Pro plan at $5/month covers 5,000 submissions, and the $59 4-year plan is roughly $1.23/month averaged. Even a store doing 50 support tickets/day stays inside the Pro plan with headroom. If you need more, contact us — we've got customers running 50k+ submissions/month on custom plans.